首页 > 编程语言 >搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

时间:2023-04-18 12:35:17浏览次数:45  
标签:C# rabbitmq1 rabbitmq Desktop Queue cluster rabbit root

我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说

一下cluster的概念,rabbitmq是erlang写的一个成品,所以知道如何构建erlang的node集群就ok了,他需要一个统一的cookie机制。。。本篇的测试环境如下:

centos1:192.168.23.147

centos2:192.168.23.145

截图如下:

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_Desktop

 

一:cookie机制

      刚才也说了,要想实现cluster集群,必须保证各台机器上的cookie文件内容一致,那问题来了。。。cookie在哪呢?从rabbitmq的官网上可以找到这么

一句话,如下图:

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_其他_02

ok,官网说的非常清楚了,那接下来我们看一下$HOME变量指向的是哪里。。。

[root@rabbitmq1 Desktop]# echo $HOME
/root
[root@rabbitmq1 Desktop]# 

 

那接下来我就去看看(Centos1 .147)这台的/root 文件下可否能够找到,如下图:

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_Desktop_03

 

牛逼了吧,嘿嘿,现在我们要做的事情,就是把Centos2的cookie文件内容替换成Centos1的cookie内容。

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_erlang_04

 

二:使用host映射erlang节点

   现在cookie值是一样的了,然后需要在/etc/hosts中追加一下host影射,方便erlang节点之间相互发现,接下来就是在2台centos上追加同样的host地址:

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_Desktop_05搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_erlang_06

 

三:rabbitmqctl cluster命令

    好了,准备工作我们都做好了,大家可以重启一下机器,开启我们的rabbitmq,这时候会有惊喜发现的。。。

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_centos_07

由原来的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集群 + Mirror Queue + 使用C#驱动连接_Desktop_08

看到没有,现在我们的rabbitmq集群已经搭建成功了,如果你有更多的机器,都可以使用这个join命令加入吧,很简单吧~~~

 

四:mirror queue

    从名字上可以看出,就是镜像队列的意思,也就是说queue能在我们多台机器中同步,设置的方式也能简单,只需要在webui的policy上面设置即可。。。

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_erlang_09

这段设置表示当前如果是mytest开头的队列都是“镜像队列”,当然也可以用代码来实现,并且实现自动同步的功能,如下:

rabbitmqctl set_policy ha-all "^mytest" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

 

五:使用C#驱动连接

  再好的cluster最后都需要用语言驱动连接,这样才能真正的落地,我选择的驱动是官方的,大家可以在nuget上面下载一下:

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_erlang_10

 

接下来我需要演示向 queue=mytest1队列中推送数据,亮点在于我在CreateConnection方法中塞入了多个ip地址。。。如下代码:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ConnectionFactory factory = new ConnectionFactory()
 6             {
 7                 UserName = "datamip",
 8                 Password = "datamip",
 9                 AutomaticRecoveryEnabled = true,
10                 TopologyRecoveryEnabled = true
11             };
12 
13             //第一步:创建connection 
14             var connection = factory.CreateConnection(new string[2] { "192.168.23.147", "192.168.23.145" });
15 
16             //第二步:创建一个channel
17             var channel = connection.CreateModel();
18 
19             var result = channel.QueueDeclare("mytest1", true, false, false, null);
20 
21             for (int i = 0; i < int.MaxValue; i++)
22             {
23                 channel.BasicPublish(string.Empty, "mytest1", null, new byte[10]);
24 
25                 Console.WriteLine("{0} 推送成功", i);
26                 Thread.Sleep(1000);
27             }
28 
29             Console.Read();
30         }
31     }

 

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_erlang_11

 

最后我们看一下webui,可以清清楚楚的看到消息已经进入了rabbitmq集群啦。。。

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接_centos_12

好了,本篇就说这么多了,希望对您有帮助~~~

 

标签:C#,rabbitmq1,rabbitmq,Desktop,Queue,cluster,rabbit,root
From: https://blog.51cto.com/u_15353947/6202813

相关文章

  • 十五天精通WCF——终结篇 那些你需要注意的坑
         终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧。 一:第一个大坑【数据传输量】我们使用wcf的目的,就是用来进行分......
  • JAVAC编译流程
    目录Javac编译过程入口java源代码词法分析->token流语法分析->抽象语法树语义分析->标注语法树AttrFlowLower代码生成->字节码Javac编译过程入口来源:com.sun.tools.javac.main.Main#compile(java.lang.String[])publicintcompile(String[]args){//创......
  • asp.net mvc 之旅 —— 第六站 ActionFilter的应用及源码分析
       这篇文章我们开始看一下ActionFilter,从名字上其实就大概知道ActionFilter就是Action上的Filter,对吧,那么Action上的Filter大概有几个呢???这个问题其实还是蛮简单的,因为我们听说Mvc本身就是一个扩展性极强的框架,自然就是层层有拦截,层层有过滤,对吧,比如我们看到的如下Control......
  • Apifox 更新 | WebSocket 接口调试功能上线!
    Apifox 新版本上线啦!欢迎升级使用:界面右上角【设置】-> 【关于Apifox】->【检查更新】看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性:支持WebSocketAPI;自动化测试功能升级;Web端新增部分功能快捷键;支持自定义设置版本更新及安装提醒。01支持WebSocketAPI最新......
  • ChatGPT/大模型+零代码,给中小企业带来哪些机会?
    ChatGPT让2023年成了AI之年。正如iPhone在2007年开启了智能手机时代,我们现在正在进入人工智能时代。新形势下,零代码应如何借势发力?伙伴云“AI+零代码”给出了答案。作为零代码领域的头部平台,伙伴云全量发布【AI零代码应用搭建平台】,无需用户单独训练,无需额外投资,根据用户具体需求、......
  • 国产Bi工具起势,瓴羊quickBI工具为数字化企业提供安全保障
    企业该如何选择智能BI工具呢?很多企业还是一味选择进口品牌,却忽视了刚刚兴起的瓴羊quickbi等国内bi工具,或许更能够满足中国企业的需求。最近,瓴羊Bi推出了30天免费试用的机会,如果您对国产Bi工具感到新鲜,不如先试用一个月体验体验。国产Bi工具相比起进口工具有哪些优势呢?以瓴羊Bi为例,......
  • NFO1113 / COMP9003
    INFO1113/COMP9003AssignmentDue:14May2023,11:59PMAESTThisassignmentisworth18%ofyourfinalgrade.TaskDescriptionInthisassignment,youwillcreateagameintheJavaprogramminglanguageusingtheProcessinglibraryforgraphicsandgradle......
  • go语言sync.Mutex
    go语言sync.mutex数据结构typeMutexstruct{ stateint32 semauint32}Mutex包含了两个字段,分别是state、sema,state表示了当前锁的状态,sema是用于控制锁的一个信号量。这是一个零值可用的结构体,零值表示未加锁state字段的最低三位表示三种状态,分别是mutexLockedmute......
  • system_code
    目录env环境变量1.ubuntu查看和添加环境变量2.添加程序路径至环境变量3.系统正常启动过程中的环境变量生效4.在其他用户下切换用户5.其他env环境变量1.ubuntu查看和添加环境变量程序运行的过程中,需要考量许多环境变量,最常用的是通过export去新建或变更一个当前窗口用户的环境......
  • ORACLE修改ORACLE_SID总结
    在某些特殊情况下,需要修改当前Oracle数据库实例中的ORACLE_SID。下面简单的总结一下如何修改$ORACLE_SID的步骤。默认情况下,INSTANCE_NAME参数和ORACLE_SID的值是相同的,但是它们也可以不同。另外,如果参数文件(pfile或spfile)中没有指定instance_name的值,那么它的值跟ORACLE_SID的值......