RabbitMQ (十四) 普通集群
上篇文章把单机集群搭建好了,可以开始验证普通集群的相关功能了.
我们首先在管理后台(15672,15673 都可以)添加一个用户,并用新用户登录,添加一个虚拟主机

由于是在一台机器上模拟集群,所以我们把创建连接的工具类小改一下,将端口号作为入参.
public static class ConnectionHelper
{
public static IConnection GetConnection(int port)
{
//定义一个连接工厂
ConnectionFactory factory = new ConnectionFactory
{
HostName = "127.0.0.1",//设置服务器地址
Port = port, //设置端口号
VirtualHost = "/vhost_wjire",//设置虚拟主机
UserName = "wjire",//设置用户名
Password = "******"//设置密码
};
//factory.AutomaticRecoveryEnabled //自动恢复连接,默认就是true
//factory.NetworkRecoveryInterval //自动恢复连接失败,默认每 5 秒重试一次 //连接恢复后才会进行拓扑恢复
//factory.TopologyRecoveryEnabled //默认也是true
return factory.CreateConnection();
}
}
一.非持久化队列验证
1.生产者连接到 node1 (5672) 声明队列,发送消息,消费者连接到 node2 (5673) 接收消息.
生产者
public class Producer
{
private const string QueueName = "test_queue";
public static void Send()
{
using (IConnection connection = ConnectionHelper.GetConnection())
using (IModel channel = connection.CreateModel())
{
var msg = "hello world";
channel.QueueDeclare(QueueName, false, false, false, null);
channel.BasicPublish("", QueueName, null, Encoding.Default.GetBytes(msg));
Console.WriteLine($"send {msg}");
}
}
}
消费者
public class Consumer
{
private const string QueueName = "test_queue";
public static void Receive()
{
IConnection connection = ConnectionHelper.GetConnection();
IModel channel = connection.CreateModel();
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
consumer.Received += (s, e) =>
{
string str = Encoding.Default.GetString(e.Body);
Console.WriteLine("consumer receive : " + str);
};
channel.BasicConsume(queue: QueueName, autoAck: true, consumer: consumer);
}
}
运行结果如下,并且在管理后台我们可以看到该队列的节点.

2.生产者连接到 node2 ,将消息发送到上面代码在 node1 声明的队列,而消费者则连接到 node2 接收消息.
测试结果一切正常,就不上图了.
二.持久化队列及消息验证
生产者部分代码
channel.QueueDeclare(QueueName, true, false, false, null);//队列持久化
var pros = channel.CreateBasicProperties();
pros.Persistent = true;//将消息设置为持久化
channel.BasicPublish("", QueueName, pros, Encoding.Default.GetBytes(msg));
消息发送后

现在,我们关闭 node1 的RabbitMQ.然后再看管理后台,当然,15672 肯定访问不了,只能访问 15673

下面,我们尝试让生产者在 node2 也就是连接到 5673 重新声明一个叫 "test_queue"的队列.
结果直接异常了,下面是异常的部分截图:

现在我们重新启动 node1 ,过了几秒后,队列恢复到了 node1 关闭之前的状态.

三.集群节点介绍
RabbitMQ集群中的节点分内存节点(RAM)和磁盘节点(disc).
- 内存节点:将所有的队列,交换机,绑定,用户,权限,vhost的元数据都存储在内存中;
- 磁盘节点:将数据存放在磁盘上.磁盘节点需要保存集群的配置信息
如果发送的是持久化消息,那么即使是内存节点,数据还是会放在磁盘中.内存节点的性能只能体现在资源管理上,比如增加或删除队列,虚拟主机,交换机等,但发送和接受消息速度同磁盘节点一样.
一个集群至少有一个节点是磁盘节点,其他节点可以都是内存节点,当节点加入或者离开集群时都要将变更通知到至少一个磁盘节点.实际使用时至少要两个磁盘节点,原因很简单,如果只有一个磁盘节点,恰巧磁盘节点挂了,那么RabbitMQ将不能创建队列,创建交换机,创建绑定,添加用户,更改权限,添加或删除节点等操作,但是可以正常的发布和消费消息. 在实际使用中必须将集群的配置放到磁盘节点上来保存.
一个集群中的节点可以共享user,vhost,exchange等,所有的数据和状态都会在所有节点上复制.在集群模式下只要有任何一个节点可以工作,RabbitMQ集群对外就能提供服务.
单机集群只允许磁盘节点,否则每次重启所有数据将会丢失.

RabbitMQ (十四) 普通集群的更多相关文章
- RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡
RabbitMQ 默认的集群模式,也就是普通模式,最大的问题就在于存储队列完整数据的节点一旦宕机, 如果是非持久化队列,则消息丢失;如果是持久化队列+持久化消息,则必须等该节点恢复. 所以后来 Rab ...
- RabbitMQ从零到集群高可用(.NetCore5.0) -高可用集群构建落地
系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...
- 搭建 RabbitMQ Server 高可用集群
阅读目录: 准备工作 搭建 RabbitMQ Server 单机版 RabbitMQ Server 高可用集群相关概念 搭建 RabbitMQ Server 高可用集群 搭建 HAProxy 负载均衡 ...
- 搭建 RabbitMQ Server 高可用集群【转】
阅读目录: 准备工作 搭建 RabbitMQ Server 单机版 RabbitMQ Server 高可用集群相关概念 搭建 RabbitMQ Server 高可用集群 搭建 HAProxy 负载均衡 ...
- Redis源码阅读(四)集群-请求分配
Redis源码阅读(四)集群-请求分配 集群搭建好之后,用户发送的命令请求可以被分配到不同的节点去处理.那Redis对命令请求分配的依据是什么?如果节点数量有变动,命令又是如何重新分配的,重分配的过程 ...
- (转)CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP.STO ...
- RabbitMQ的高可用集群部署
RabbitMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RabbitMQ部署的三种模式 1.1 单一模式 单机情况下不做集群, 仅仅运行一个RabbitMQ. # docker-c ...
- RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列
系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...
- 四十.创建Redis集群 管理集群
环境准备 准备 6台(51-56) redis服务器 以默认配置运行redis服务即可 一.创建Redis集群 1.启用集群功能( 51-56 都要配置) ]# netstat -antupl ...
随机推荐
- 【Foreign】咏叹 [模拟退火]
咏叹 Time Limit: 100 Sec Memory Limit: 256 MB Description 有n根木棍,第i根长度为ai.你要贴着墙围出一个矩形区域,木棍围成的矩形边缘必须平行或 ...
- iOS开发者两分钟学会用GitHub在Mac上托管代码的两种方法
原文发布者:http://blog.csdn.net/duxinfeng2010 在Mac上使用Xcode进行iOS-Apple苹果iPhone手机开发过程中少不了使用GitHub在Mac上托 ...
- python学习笔记(三)之变量和字符串
在其他语言中,变量就是有名字的存储区,可以将值存储在变量中,也即内存中.在Python中略有不同,python并不是将值存储在变量中,更像是把名字贴在值上边.所以,有些python程序员会说pytho ...
- lnmp、lamp、lnmpa一键安装包(Updated: 2016-4-12)
lnmp.lamp.lnmpa一键安装包(Updated: 2016-4-12) 文章目录 脚本特性 安装步骤 如何添加虚拟主机? 如何删除虚拟主机? 如何管理ftp账号? 数据备份 如何管理服务 ...
- 64_g4
gnatcoll-2014-10.fc26.x86_64.rpm 28-Feb-2017 17:44 1738266 gnatcoll-devel-2014-10.fc26.i686.rpm 28-F ...
- 【bzoj2006】NOI2010超级钢琴
补了下前置技能…… 题意就是求一段区间的权值和前k大的子序列的和. 把段扔进优先队列 每次拿出来之后按照所选择的j进行分裂 #include<bits/stdc++.h> #define ...
- HDU 6186 CS Course 前缀和,后缀和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6186 题意:给了n个数,然后有q个查询,每个查询要求我们删掉一个数,问删掉这个数后整个序列的与值,或值 ...
- CNN中已知input_size、kernel_size、padding、stide计算output公式的理解
在进行卷积运算和池化的时候,对于输入图像大小为input_size,给定kernel_size.padding.stride,计算得出output_size为: output_size =1+ (in ...
- laravel 中的入口文件报错
1.此次是由于加载的配置文件的编码错误导致的.例:conf.php
- Redis -- 数据类型小结
redis key 的命名规则: 对象类型:对象id:对象属性 (hset car:1: price 500.hset car:1: name:tom) 一.redis 数据类型: 1. 字符串类型 ...