如果你連接過關系數據庫,例如SQL Server
。你會發現EasyNetQ
處理connections
有點奇怪。和關系數據庫通訊一直都是通過client
開始的。Client
打開一個連接, 發出一個SQL
命令,如有必要時,處理結果,然后關閉連接。一般建議是你維持一個打開的連接,時間要盡可能短,通過API
斷開連接池。
諸如與RabbitMQ
這樣的消息代理會話,是有些不同的,因為連接傾向於在應用的整個生命周期內保持連接狀態。通常你打開一個連接,創建一個訂閱,然后打開連接后,等待消息到來。EasyNetQ
不能保證代理在所有的時間都是可用的。相反它使用了延遲連接的方法,在后台線程輪詢終結點,直到連接成功。假如服務器出於任何原因連接斷開了(可能是網絡故障,或許是RabbitMQ Server
自身的原因斷開了),EasyNetQ
將恢復輪詢終結點直到重新連接成功。
標准的做法是在你應用的生命周期內只創建一個IBus
實例.當你的應用關閉后Dispose
掉它。
延遲連接到RabbitMQ
服務器是通過IBus
接口表示的。大部分EasyNetQ
操作都是IBus
上的方法。創建一個IBus
實例如下:
var bus = RabbitHutch.CreateBus("host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret")
- 1
這個連接字符串是由鍵值對組成,格式如下 key=value
, 通過分號;分隔。只有一個必選的字段是host
.可能的連接字符串值是:
host
(例如host=localhost
或host=192.168.2.56
或host=myhost.mydomain.com
)這個字段是必選的。如要具體指定你要連接服務器端口,你用標准格式host:port
(例如:host=myhost.com:5673
)。假如你省略了端口號,AMQP默認端口是5672.連接到RabbitMQ集群,需要指定每一個集群節點用逗號分隔(例如:host:myhost1.com,myhost2.com,myhost3.com
).更多詳情請參考Cluster Support
virtualhost
(例如:virtualHost=myVirturalHost)默認虛擬主機是’/’
username
(例如:username=mike
)默認是’guest’(對於非’localhost’主機你需要使用其他用戶名)
password
(例如:password=mysecret)默認為’guest’
requestedHearbeat
(例如:requestHearbeat=10
)默認為10秒鍾。沒有心跳設置為0
prefetchcount
(例如:prefetchcount=1
) 默認為50.這個值是在EasyNetQ
發送ack
之前發送給RabbitMQ
的消息數。不限制設置為0(不推薦). 為了在消費者之間保持公平和平衡設置為1.
publisherConfirms
(例如:publisherconfirms=true
)默認是false
。 如何開啟Publisher Confirms
?
persistentMessages
(例如:persistentMessages=false
)默認為true。這個決定了在發送消息時采用什么樣的delivery_mode
。false=1,true=2
. 設置為true
,RabbitMQ
將會把消息持久化到磁盤,並且在服務器重啟后仍會存在。設置為false
可以提高性能收益。
product
(例如:product=我的現實中重要的服務)在EasyNetQ 0.27.3中被引進。默認值是Bus的實例名。
此處輸入的值將顯示在RabbitMQ的后台管理界面中。
platform
(例如:platform=my.fully.qualified.domain.name
)在EasyNetQ 0.27.3
中被引進。默認值是運行着客戶端處理Bus
的實例的機器的主機名。此處輸入的值將會線上在RabbitMQ
管理端界面中。
timeout
(例如:timeout=60
)模式值為10秒。在EasyNet 0.17
中被引進。可解析類型為System.UInt16
從0到65535范圍內的值。不限制超時時間設置為0.當超時事時拋出System.TimeoutException
.
關閉連接,只要簡單的dispose
,如下:
bus.Dispose();
這樣就關閉了EasyNetQ
使用過的連接、管道、消費者和所有其他資源。
EasyNetQ
可以通過SSL進行連接。這篇指南的作者Gordon Coulter最初為回應一個提問寫的。
首先,你必須仔細依據https://www.rabbitmq.com/ssl.html文章中的步驟。我花費了很多時間嘗試讓openssl
這部分能運作起來,然后為了讓他按我的需要去運作而不僅僅只是一個demo
,我又花費了很多時間。
第一次通過SSL
讓EasyNetQ
運作時,在他們為了測試而做的可以運行的頁面上的那點DotNet
代碼給我提供了很大幫助。我有一個簡單的控制台程序,包涵了Rabbit
和EasyNetQ
代碼,會在下面展示。此外使用了Rabbit logs
。
當你連接上后,管理界面的connection
頁面會顯示一個小的SSL
協議標簽。你也在Overview
選項卡的端口監聽表里看到443端口。
代碼如下:
var connection = new ConnectionConfiguration(); connection.Port = 443; connection.UserName = "user"; connection.Password = "pass"; connection.Product = "SSLTest"; var host1 = new HostConfiguration(); host1.Host = "rmq1.contoso.com"; host1.Port = 443; host1.Ssl.Enabled = true; host1.Ssl.ServerName = "rmq1.contoso.com"; host1.Ssl.CertPath = "c:\\tmp\\myclient.p12"; host1.Ssl.CertPassphrase = "secret"; var host2 = new HostConfiguration(); host2.Host = "rmq2.contoso.com"; host2.Port = 443; host2.Ssl.Enabled = true; host2.Ssl.ServerName = "rmq2.contoso.com"; host2.Ssl.CertPath = "c:\\tmp\\myclient.p12"; host2.Ssl.CertPassphrase = "secret"; connection.Hosts = new List<HostConfiguration> { host1, host2 }; connection.Validate(); //VERY IMPORTANT - DOES CONFIG AS WELL AS VALIDATION! var Bus = RabbitHutch.CreateBus(connection, services => services.Register<IEasyNetQLogger>(logger => new DoNothingLogger()));
盡管在ConnectionConfiguration
上有一個Ssl
選項屬性,但在HostConfiguration
對象上設置Ssl
選項屬性是一個合適的地方。HostConfiguration
對象上設置SSL
選項可以支持集群的場景。注意,在上面代碼中我們指定了兩個HostConfiguration
對象。假如一個掛了,EasyNetQ
的持續連接功能將自動連接到下一個可用的主機。在這個主機上配置SSL
在連接時就不會出現任何錯誤。
假如你僅僅指定一個主機,你可以選擇通過HostConfiguration
對象去設置SSL
選項,也可以直接用ConnectionConfiguration
對象去設置。
不要忘記調用Validate()
方法。我最初跳過那兒(基本上我寫的都是硬編碼,因此可能沒有什么錯誤需要驗證)。但是,這個方法調用實際上回去應用一系列設置,為了確保連接運行是必要的。
SslOption
詳情參見文檔SslOption Class
你可以嘗試用官方的RabbitMQ .NET client
去配置和測試,嘗試去運行示例。首先要闡明,在你的項目做任何修改前,所有這些設置都被正確的描述在Official RabbitMQ SSL documentation for .NET.
EasyNetQ
提供了一個Logger
接口 IEasyNetQLogger
:
public interface IEasyNetQLogger { void DebugWrite(string format,params object[] args); void InfoWrite(string format, params object[] args); void ErrorWrite(string format, params object[] args); void ErrorWrite(Exception exception); }
Logging
默認是關閉的,NullLogger
作為IEasyNetQLogger
的具體實現被注冊進去。
有一個控制台Logger(ConsoleLogger)
可以用來做測試或調試。但是,它或許不能在生產環境系統中使用。調試級別的Logging
是非常詳細的,記錄了所有信息,會對你的應用有性能上的影響。並且,這可能對於那些在AMQP
和EasyNetQ
方面沒有深入了解的人來說沒有多大意義。
你應該提供自己的基於IEasyNetQLogger
實現,記錄日志信息和錯誤信息到自己的應用日志中。RabbitHutch.CreateBus
方法提供了overloads
方法,允許你替換成自己的日志組件。參看Replacing EasyNetQ Components
.你可以使用這個方法注冊自己的Logger
到Bus
中。示例如下:
var logger = new MyLogger();// IEasyNetQLogger實現。 var bus = RabbitHutch.CreateBus(“我的連接字符串”,x => x.Register<IEasyNetQLooger>(_ => looger));