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