使用 C# sdk 连接 高可用的 rabbitmq 镜像集群
我們知道rabbitmq是一個專業的MQ產品,而且它也是一個嚴格遵守AMQP協議的玩意,但是要想高端大氣上檔次,一定需要拿出高可用的東西出來,這不本篇就跟大家說一下cluster的概念,rabbitmq是erlang寫的一個成品,所以知道如何構建erlang的node集群就ok了,他需要一個統一的cookie機制。。。本篇的測試環境如下:
centos1:192.168.23.147
centos2:192.168.23.145
截圖如下:
一:cookie機制
剛才也說了,要想實現cluster集群,必須保證各臺機器上的cookie文件內容一致,那問題來了。。。cookie在哪呢?從rabbitmq的官網上可以找到這么一句話,如下圖:
ok,官網說的非常清楚了,那接下來我們看一下$HOME變量指向的是哪里。。。
[root@rabbitmq1?Desktop]#?echo?$HOME /root那接下來我就去看看(centos1 .147)這臺的 /root 文件下可否能夠找到,如下圖:
????????了吧,嘿嘿,現在我們要做的事情,就是把Centos2的cookie文件內容替換成Centos1的cookie內容。
二:使用host映射erlang節點
現在cookie值是一樣的了,然后需要在 /etc/hosts 中追加一下host影射,方便erlang節點之間相互發現,接下來就是在2臺centos上追加同樣的host地址:
三:rabbitmqctl cluster命令
好了,準備工作我們都做好了,大家可以重啟一下機器,開啟我們的rabbitmq,這時候會有驚喜發現的。。。
由原來的localhost改成現在的rabbitmq2了,看到了吧~~~ 接下來大家可以把兩臺rabbitmq開啟了。
1. 在centos1上使用rabbitmqctl cluster_status看看集群現在的狀況
[root@rabbitmq1?Desktop]#?rabbitmqctl?cluster_status Cluster?status?of?node?rabbit@rabbitmq1?... [{nodes,[{disc,[rabbit@rabbitmq1]}]},{running_nodes,[rabbit@rabbitmq1]},{cluster_name,<<"rabbit@rabbitmq1">>},{partitions,[]},{alarms,[{rabbit@rabbitmq1,[]}]}] [root@rabbitmq1?Desktop]#?可以看到,當前的 running-nodes 中只有一臺,剛好就是本機的 erlang 節點本身,接下來我們看一下是否能夠連接到rabbit@rabbitmq2上去。。。
2. join_cluster命令
這個命令之前,需要將本機的rabbitmq關閉,然后進行join操作,從下圖中可以看到,我們已經連接到了centos2上的rabbitmq了。。。
[root@rabbitmq1?Desktop]#?rabbitmqctl?stop_app Stopping?node?rabbit@rabbitmq1?... [root@rabbitmq1?Desktop]#??rabbitmqctl?join_cluster?rabbit@rabbitmq2 Clustering?node?rabbit@rabbitmq1?with?rabbit@rabbitmq2?... [root@rabbitmq1?Desktop]#?rabbitmqctl?start_app Starting?node?rabbit@rabbitmq1?... [root@rabbitmq1?Desktop]#?3. 使用webui看一下最后的效果
看到沒有,現在我們的rabbitmq集群已經搭建成功了,如果你有更多的機器,都可以使用這個join命令加入吧,很簡單吧~~~
四:mirror queue
從名字上可以看出,就是鏡像隊列的意思,也就是說queue能在我們多臺機器中同步,設置的方式也能簡單,只需要在webui的policy上面設置即可。。。
這段設置表示當前如果是mytest開頭的隊列都是“鏡像隊列”,當然也可以用代碼來實現,并且實現自動同步的功能,如下:
rabbitmqctl?set_policy?ha-all?"^mytest"?'{"ha-mode":"all","ha-sync-mode":"automatic"}'五:使用C#驅動連接
再好的cluster最后都需要用sdk連接,這樣才能真正的落地,我選擇的sdk是官方的,大家可以在nuget上面下載一下:
接下來我需要演示向 queue=mytest1隊列中推送數據,亮點在于我在CreateConnection方法中塞入了多個ip地址。。。如下代碼:
class?Program{static?void?Main(string[]?args){ConnectionFactory?factory?=?new?ConnectionFactory(){UserName?=?"datamip",Password?=?"datamip",AutomaticRecoveryEnabled?=?true,TopologyRecoveryEnabled?=?true};//第一步:創建connectionvar?connection?=?factory.CreateConnection(new?string[2]?{?"192.168.23.147",?"192.168.23.145"?});//第二步:創建一個channelvar?channel?=?connection.CreateModel();var?result?=?channel.QueueDeclare("mytest1",?true,?false,?false,?null);for?(int?i?=?0;?i?<?int.MaxValue;?i++){channel.BasicPublish(string.Empty,?"mytest1",?null,?new?byte[10]);Console.WriteLine("{0}?推送成功",?i);Thread.Sleep(1000);}Console.Read();}}最后我們看一下webui,可以清清楚楚的看到消息已經進入了rabbitmq集群啦。。。
好了,本篇就說這么多了,希望對您有幫助~~~
總結
以上是生活随笔為你收集整理的使用 C# sdk 连接 高可用的 rabbitmq 镜像集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自由软件基金会庆祝成立35周年
- 下一篇: C#刷剑指Offer | 二叉树中和为某