@x-power
2019-09-18T08:11:16.000000Z
字数 2431
阅读 998
消息队列 实战
单机情况下不做集群, 仅仅运行一个RabbitMQ.
# docker-compose.ymlversion: '3.1'services:rabbitmq:restart: alwaysimage: rabbitmq:managementcontainer_name: rabbitmqports:- 5672:5672- 15672:15672environment:TZ: Asia/ShanghaiRABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: 123456volumes:- ./data:/var/lib/rabbitmq
默认模式,以两个节点(
rabbits01,rabbits02)为例来说明. 对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构. 当消息进入rabbit01节点的Queue后,consumer从rabbit02消费的时候,RabbitMQ会临时在rabbit01,rabbit02之间进行消息传输, 把A中的消息实体取出并经过B发送给consumer. 所以consumer应该尽量链接每一个节点, 从中取出消息. 即对于同一个逻辑队列, 要在多个节点建立物理Queue. 否则无论consumer链接rabbit01还是rabbit02,出口总在rabbit01这样就会产生瓶颈, 当rabbit01节点故障之后 ,rabbit02无法取到rabbit01节点中还未消费的消息实体. 如果做了消息持久化, 那么得等rabbit01节点恢复才可以被消费, 如果没有持久化的话 就会出现消息丢失的情况.
RabbitMQ的.erlang.cookie的值一致化. ping通.
version: '3.1'services:myrabbit01:restart: alwaysimage: rabbitmq:managementcontainer_name: myrabbit01ports:- 5672:5672- 15672:15672environment:TZ: Asia/ShanghaiRABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: 123456RABBITMQ_ERLANG_COOKIE: rabbitcookievolumes:- ./data:/var/lib/rabbitmqhostname:rabbit01network_mode: bridge
version: '3.1'services:myrabbit02:restart: alwaysimage: rabbitmq:managementcontainer_name: myrabbit02ports:- 5673:5672- 15673:15672environment:TZ: Asia/ShanghaiRABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: 123456RABBITMQ_ERLANG_COOKIE: rabbitcookievolumes:- ./data:/var/lib/rabbitmqextra_hosts:- rabbit01 myrabbit01:172.17.0.2hostname:rabbit02network_mode: bridge
# 添加 集群docker exec -it myrabbit02 bashrabbitmqctl stop_apprabbitmqctl resetrabbitmqctl join_cluster --ram rabbit@rabbit01rabbitmqctl start_appexit
Spring Boot配置文件如下
spring:application:name: spring-boot-amqprabbitmq:username: adminpassword: 123456addresses: 192.168.219.151:5673,192.168.219.151:5672
把需要的队列做成镜像队列, 这样不管连接那个节点, 都可以顺利的存取数据, 解决了普通模式的问题.
缺点也很明显, 这样在不同的节点内复制数据会明显的降低系统性能, 集群内的网络带宽会被大大的消耗掉.
镜像模式首先要依赖
policy模块, 这个模块是怎么用的呢?
policy中文意思是政策,策略. 按照这个策略 那些Exchange或者Queue的数据需要复制,同步,那么如何做呢? 其实也就是在1.2的基础上, 在主节点上设置如下:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
参数意思:
ha-all-为策略名称.^,^zlh为匹配名称为zlh的exchange或者Queue.
ha-mode: 为匹配类型, 他分为三种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)。
现在的各种云还是比较稳定的, 使用普通模式其实就已经够用了.