MQ 集群高可用+

一.消息确认

1. RabbitMQ提供了transaction、confirm 消息确认机制

2. RabbitMQ提供了transaction、confirm两种消息确认机制。

transaction即事务机制,手动提交和回滚;confirm机制提供了ConfirmlistenerwaitForConfirms两种方式。confirm机制效率明显会高于transaction机制,但后者的优势在于强一致性。如果没有特别的要求,建议使用conrim机制。 

2.1
、从实验来看,消息的确认机制只是确认publisher发送消息到broker,由broker进行应答,不能确认消息是否有

       效消费。 
2.2
、而为了确认消息是否被发送给queue,应该在发送消息中启用参数mandatory=true,使用ReturnListener接收

未被发送成功的消息。 
2.3
、接下来就需要确认消息是否被有效消费。publisher端目前并没有提供监听事件,但提供了应答机制来保证消息被成功消费,应答方式: 
   basicAck:成功消费,消息从队列中删除 
   basicNack:requeue=true,消息重新进入队列,false被删除 
   basicReject:等同于basicNack 
   basicRecover:消息重入队列,requeue=true,发送给新的consumer,false发送给相同的consumer 

3. 消息确认例子:https://www.jianshu.com/p/2c5eebfd0e95

3.1

·  持久化

  • exchange要持久化
  • queue要持久化
  • message要持久化

·  消息确认

  • 启动消费返回(@ReturnList注解,生产者就可以知道哪些消息没有发出去)
  • 生产者和Server(broker)之间的消息确认
  • 消费者和Server(broker)之间的消息确认

二.消息消费

1. 消息队列如何保证幂等性,避免消息重复消费

参考:https://www.jianshu.com/p/7d5a1bf94f2e

三.Rabbitmq集群高可用

RabbitMQ是 erlang开发的,集群 常 ,因为erlang天 就是 分布式语 ,但其本身并 持负载均衡

1.集群中的基本概念:

RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。 过,如前 所述,如果在投递消息时,打开 消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的, 个 外是,那些 当前只属于创建它的节点的消息队 ,尽管它们可 且可被所有节点读取。rabbitmq节点可以动态的加 到集群中, 个节点它可以加 到集群中,也可以从集群环集群会进 个基本的负载均衡。
集群中有两种节点:

A.内存节点:只保存状态到内存( 个 外的情况是:持久的queue的持久内容将被保存到disk)
B . 磁盘节点:保存状态到内存和磁盘。 内存节点虽然 写 磁盘,但是它执 磁盘节点要好。集群中,只需要 个磁盘节点来保存状态 就 够 如果集群中只有内存节点,那么 能停 它们,否则所有的状态,消息等都会丢失。

那么具体如何实现RabbitMQ 可 ,我们先搭建 个普通集群模式,在这个模式基础上再配置镜像模式实现 可 ,Rabbit集群前增加 个反向代 , 产者、消费者通过反向代 访问RabbitMQ集群。

架构图如下:图 来 http://www.nsbeta.info 上述图 是3个RabbitMQ运 在同 主机上,分别 同的服务端 。当然我们的 产实际 ,多个RabbitMQ肯定是运 在 不同的物理服务上,否则就失去 高可用的意义。

集群模式配置

设计架构可以如下:在 个集群 ,有4台机 ,其中1台使 磁盘模式,另2台使 内存模式。2台内存模式的节点, 疑速度 快,因此客户端(consumer、producer)连接访问它们。 磁盘模式的节点,由于磁盘IO相对较慢,因此仅作数据备份使 ,另外 台作为反向代 。

四台服务 hostname分别为:queue 、panyuntao1、panyuntao2、panyuntao3(ip:172.16.3.110) 配置RabbitMQ集群 常简单,只需要 个命令,配置步骤如下

step1:queue、panyuntao1、panyuntao2做为RabbitMQ集群节点,分别安装RabbitMq-Server ,安装后分别启动RabbitMq-   server 启动命令 # Rabbit-Server start ,安装过程及启动命令参

:http://www.cnblogs.com/flat_peach/archive/2013/03/04/2943574.html

step2:在安装好的三台节点服务 中,分别修改/etc/hosts 件,指定queue、panyuntao1、panyuntao2的hosts,如:

172.16.3.32 queue 172.16.3.107 panyuntao1 172.16.3.108 panyuntao2

还有hostname 件也要正确,分别是queue、panyuntao1、panyuntao2,如果修改hostname建议安装rabbitmq前修改。 请注意RabbitMQ集群节点必须在同 个 段 ,如果是跨 域 效果就差。

step3:设置每个节点Cookie

Rabbitmq的集群是依赖于erlang的集群来 作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过 个 magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中, 件是400的权限。所以必须保证各节点 cookie保持 致,否则节点之间就 法通信。
-r--------. 1 rabbitmq rabbitmq 20 3 5 00:00 /var/lib/rabbitmq/.erlang.cookie 将其中 台节点上的.erlang.cookie值复制下来保存到其他节点上。或者使 scp的 法也可,但是要注意 件的权限和属主属 组。

我们这 将queue中的cookie 复制到 panyuntao1、panyuntao2中,先修改下panyuntao1、panyuntao2中的.erlang.cookie权限 #chmod 777 /var/lib/rabbitmq/.erlang.cookie 将queue的/var/lib/rabbitmq/.erlang.cookie这个 件,拷 到panyuntao1、panyuntao2的同 位置(反过来亦可),该 件是 集群节点进 通信的验证密钥,所有节点必须 致。拷完后重启下RabbitMQ。 复制好后别忘记还原.erlang.cookie的权限,否则可能会遇到错误

#chmod 400 /var/lib/rabbitmq/.erlang.cookie

设置好cookie后先将三个节点的rabbitmq重启 # rabbitmqctl stop
# rabbitmq-server start

step4:停 所有节点RabbitMq服务,然后使 detached参数独 运 ,这步很关键,尤其增加节点停 节点后再次启动遇到 法启动 都可以参照这个顺序

queue# rabbitmqctl stop panyuntao1# rabbitmqctl stop panyuntao2# rabbitmqctl stop

queue# rabbitmq-server -detached panyuntao1# rabbitmq-server -detached panyuntao2# rabbitmq-server -detached

分别查看下每个节点

queue# rabbitmqctl cluster_status

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值