赞
踩
在计算机世界中,消息传递就像是一场神奇的旅行,消息在系统之间飞来飞去,就像是魔法传送一样。而今天,我们将进入一个充满奇幻冒险的领域——RabbitMQ集群的实现。
想象一下,RabbitMQ就是我们的信使兔子,它们不仅聪明灵活,还能够把消息从一个地方快速传递到另一个地方。而RabbitMQ集群就像是一支强大的兔子家族,它们紧密合作,确保消息永远不会丢失,就像是一场兔子魔法秀。
在这个奇幻的旅程中,我们将揭开RabbitMQ集群的面纱,一起探索如何构建一个强大的消息传递系统,它能够应对高负载、容错性强,就像是一支无所不能的魔法军团。
所以,准备好跟随我们的兔子朋友,踏上这段有趣而充满挑战的消息传递冒险吧!在这个奇妙的世界里,你将发现消息传递的魔法是无穷无尽的。
对于RabbitMQ可以先进行几个知识点的讲解
Direct Exchange(直连交换器):
Topic Exchange(主题交换器):
Fanout Exchange(扇出交换器):
Headers Exchange(头交换器):
选择合适的交换器类型取决于你的应用架构和消息传递需求。通常情况下,使用直连交换器和主题交换器可以满足大多数场景。如果你需要在多个队列之间广播消息,可以使用扇出交换器。如果需要基于消息头部属性进行匹配,可以使用头交换器。
要注意的是,交换器类型一旦设置后,通常是不可更改的。因此,在选择交换器类型时需要根据实际需求进行权衡和规划。
在 RabbitMQ 中,“policies”(策略)是一种机制,用于自动化管理和配置交换器、队列和绑定的行为。策略允许你在 RabbitMQ 集群中定义一组规则,这些规则会自动应用于交换器、队列和绑定,从而在满足特定条件时执行预定义的操作。这样可以简化管理、提高效率,并确保一致性。
策略可以用于许多方面,包括队列的镜像、过期时间、消息最大长度、死信队列等。通过设置策略,你可以在集群中的多个节点上自动应用相同的配置,而不需要手动进行每个节点的配置更改。
以下是一些策略的常见作用:
镜像队列策略: 允许你在队列声明时自动将队列设置为镜像队列,从而实现消息冗余备份和高可用性。
队列过期策略: 允许你设置队列中的消息的过期时间,当消息过期时,RabbitMQ 会自动将其从队列中删除。
消息最大长度策略: 允许你限制队列中消息的最大长度,当队列中的消息数量达到设置的最大长度时,新的消息将被丢弃或处理为死信。
死信队列策略: 允许你将队列中无法被消费的消息自动发送到死信队列,以便进一步处理。
优先级队列策略: 允许你为消息设置优先级,并根据优先级将消息放入不同的队列中。
等等。
要设置策略,你可以使用 RabbitMQ Management 插件的管理界面,也可以使用命令行工具(如 rabbitmqctl
)。通过设置策略,你可以实现自动化管理和配置,减少手动操作的需要,提高系统的可靠性和可维护性。
参数说明:
Pattern(匹配模式):
*
和 #
。amq.*
匹配所有以 amq.
开头的交换器。Definition(定义):
ha-mode
和其他相关参数。ha-mode(镜像队列模式):
ha-mode = all
或 ha-mode = exactly
或 ha-mode = nodes
all
:将队列设置为镜像队列,在所有节点上创建队列的镜像。exactly
:将队列设置为镜像队列,并指定要创建的镜像节点数量。nodes
:将队列设置为镜像队列,指定要在哪些节点上创建镜像。ha-params(镜像队列参数):
ha-params = ["node1", "node2"]
ha-mode = nodes
,指定创建队列镜像的节点列表。expires(消息过期时间):
expires = 3600000
(毫秒)message-ttl(消息存活时间):
message-ttl = 60000
(毫秒)max-length(最大消息数量):
max-length = 1000
dead-letter-exchange(死信交换器):
dead-letter-exchange = dlx_exchange
dead-letter-routing-key(死信路由键):
dead-letter-routing-key = dlx_routing_key
max-length-bytes(最大消息字节数):
max-length-bytes = 102400
lazy-mode(延迟模式):
lazy-mode = on
或 lazy-mode = off
queue-mode(队列模式):
queue-mode = lazy
或 queue-mode = default
lazy
表示延迟模式,default
表示默认模式。Priority(优先级):
Apply to(应用于):
之所以说上面的东西,主要是为了实现我们的集群,也就是我添加的策略,因为如果单独创建队列的话,它是默认只属于当前的节点的,所以需要依靠镜像,或者说这种策略实现
version: '3' services: rabbitmq-node1: image: rabbitmq:3.9.22-management container_name: rabbitmq-node1 hostname: rabbitmq-node1 # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60 entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1.pid" ports: - "5672:5672" - "15672:15672" volumes: - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf environment: - RABBITMQ_DELAYED_MESSAGE_ENABLED=true - RABBITMQ_DEFAULT_USER=admin - RABBITMQ_DEFAULT_PASS=123456 - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange - RABBITMQ_NODENAME=rabbit@rabbitmq-node1 # 节点名称 # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。 networks: - rabbitmq-network rabbitmq-node2: image: rabbitmq:3.9.22-management container_name: rabbitmq-node2 hostname: rabbitmq-node2 entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node2.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1" # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60 ports: - "5673:5672" - "15673:15672" volumes: - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf environment: - RABBITMQ_DELAYED_MESSAGE_ENABLED=true - RABBITMQ_DEFAULT_USER=admin - RABBITMQ_DEFAULT_PASS=123456 - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange - RABBITMQ_NODENAME=rabbit@rabbitmq-node2 # 节点名称 # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。 networks: - rabbitmq-network depends_on: - rabbitmq-node1 rabbitmq-node3: image: rabbitmq:3.9.22-management container_name: rabbitmq-node3 hostname: rabbitmq-node3 # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60 entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node3.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1" ports: - "5674:5672" - "15674:15672" volumes: - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf environment: - RABBITMQ_DELAYED_MESSAGE_ENABLED=true - RABBITMQ_DEFAULT_USER=admin - RABBITMQ_DEFAULT_PASS=123456 - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange #被废弃了 - RABBITMQ_ERLANG_COOKIE=97c78681-3394-208f-9d04-b86cb68f9c60 # 为了确保集群节点通信,需要设置相同的 erlang-cookie - RABBITMQ_NODENAME=rabbit@rabbitmq-node3 # 节点名称 # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。 networks: - rabbitmq-network depends_on: - rabbitmq-node1 networks: rabbitmq-network: driver: bridge
⚠:这里使用的挂载,第一个是实现的延迟队列插件,第二个是挂载所需的cookie
,这个cookie
可以是任意的,第三个是配置文件
上面部分语句说明如下
entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node3.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1"
:等待并加入集群RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
:指定要加载的插件,且加载预先下载好的RABBITMQ_DELAYED_MESSAGE_ENABLED=true
:启动消息延迟功能# 配置内容
# 这个配置的作用是禁用 "guest" 用户对本地(loopback)的访问。
loopback_users.guest = false
listeners.tcp.default = 5672
# 这个配置指定了集群节点之间的发现机制。`rabbit_peer_discovery_classic_config` 表示使用经典配置方式来进行节点发现。
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
# 这个配置指定了集群中的节点,`rabbit@rabbitmq-node1` 表示第一个节点的名称和主机地址。
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3
⚠:上面的文件要处于同级目录
如果是实现集群连接的话,这个在go与java中还是有所不同的,但是我们可以是用nginx来做一下负载均衡来实现,或者说RabbitMQ它也有自己的实现
⚠:nginx模块中需要添加stream模块,才可以实现,和连接mysql是一样的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。