1.消息补偿
消息可靠性保障:——消息补偿机制
需求:100%确保消息发送成功
2.幂等性保障
幂等性指一次和多次请求某一资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与第一次执行的影响相同
在MQ中是指,消费多条相同的消息,得到与消费该消息一次相同的结果
消息幂等性保障——乐观锁机制
3.集群搭建-镜像队列
集群方案原理
RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的
此处展示单机多实例部署,多个节点之间用端口来区分,在使用真正的集群时用ip来区分即可
单机多实例部署
启动单实例RabbitMQ
查看RabbitMQ运行状态,确保RabbitMQ运行正常
查看正常无误后,停止以上单实例RabbitMQ
启动第1个节点实例(前台启动)
端口:5673,web管理插件端默认端口:15672
注: 这里将默认端口5672留给HA使用
(前台启动方式)
启动第2个节点实例
附:结束集群节点命令
重置rabbit1实例为主节点
在新的会话窗口,依次执行命令(停止—>重置—>启动)
重置rabbit2实例为从节点
在新的会话窗口,依次执行命令(停止—>重置—>设为从节点—>启动)
将rabbit2加入到rabbit1节点,作为rabbit1的从节点
查看集群状态命令
说明: 此时在rabbit1节点创建的队列和队列内的消息在rabbit2节点也能看到。但是当rabbit1节点宕机时,rabbit2也将无法看到rabbit1之前的队列和消息(造成消息丢失),原因是配置到此步骤,仍然没能实现队列和消息等的同步
附:集群管理相关命令
RabbitMQ镜像集群配置
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式一定程度上解决了项目节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列(即集群策略Policy)
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做
设置的镜像队列(即添加集群策略Policy:同步交换机和队列)
可以通过RabbitMQ的web管理端设置
或 通过dos命令设置
此时在rabbit1节点rabbit2节点已实现队列和交换机同步
4.集群搭建-安装HAProxy,进行负载均衡
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数
安装依赖包
下载源码包 :OpenPKG Project: Download
解压到/usr/local目录
进入源码目录、编译、安装
添加组、用户,并赋权
配置haproxy(创建目录、创建配置文件haproxy.cfg)
haproxy.cfg中写入以下内容
注: 在配置文件/etc/haproxy/haproxy.cfg中的listen stats下的bind属性中的IP地址需换成服务器IP,不能改为127.0.0.1,否则HAProxy的web管理页面访问不了
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 60s
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
balance roundrobin
server node1 127.0.0.1:5673 check inter 5000 rise 2 fall 2
server node2 127.0.0.1:5674 check inter 5000 rise 2 fall 2
listen stats
bind 192.168.235.129:8100
mode http
option httplog
stats enable
stats uri /rabbitmq-stats
stats refresh 5s
启动HAproxy负载,并查看haproxy进程
其他命令