一.消息确认
1. RabbitMQ提供了transaction、confirm 消息确认机制
2. RabbitMQ提供了transaction、confirm两种消息确认机制。
transaction即事务机制,手动提交和回滚;confirm机制提供了Confirmlistener和waitForConfirms两种方式。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