消息中间件的主要的作用:
[1]系统解耦
[2]流量消锋
[3]数据分发


####### 1.基本 

RabbitMQ 开源免费,官方也提供商业特性支持。

用erlang语言开发。RabbitMQ是AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的标准实现。RabbitMQ的broker由Exchange、Binding、queue组成。
是一个传统的消息队列系统,采用了基于消息队列的发布-订阅模型。
设计目标是确保消息的可靠传递,并提供多种消息传递协议的支持
通常用于实时的、对可靠性要求较高的消息传递上

是否支持消息全局有序 :是。同一队列内消息是有序,按照先进先出原则来存储和消费。但不同队列之间消息是无序的,即不能保证跨队列的消息按照全局顺序来处理
是否支持消息分区有序 :是 
是否支持topic优先级  :是
是否内置监控         :是
是否支持多个生产者   :一个topic支持多个生产者
是否支持多个消费者   :一个topic支持多个消费者(一个消费者可消费多个分区,一个分区可被多个消费组消费,但同一消费组内仅能有一个消费者同时消费1个分区)
一个分区多个消费者   : 不支持
是否支持JMX          : 不支持(非java语言编写)
是否支持加密         : 支持
消息队列协议         : AMQP、MQTT、STOMP
是否支持消息追踪     : 支持
客户端语言支持       :
是否支持广播消息     :支持
是否支持消息回溯     :不支持,消息确认被消费后,会被删除
是否支持消息持久化   :支持消息数据持久。常用将数据缓存在内存中,支持消息确认和事务机制,以提高可靠性和一致性。RabbitMQ 也可以将数据持久化到磁盘中,但是会降低性能和吞吐量。RabbitMQ 更适合处理小规模且实时性较高的数据。
是否支持消息堆积     :支持阈值内的消息对接,无法支持较大的消息堆积
是否支持流量控制     :支持生产者的流量控制
是否支持事务性消息     :支持。基于AMQP协议
消费者确认机制       :支持。消费者在接收并处理完消息后向队列发送确认信号,队列才会删除该消息,这样可以保证消息的可靠传递
消息路由             :支持。支持多种交换机类型,例如直接交换机(direct exchange)、主题交换机(topic exchange)、扇形交换机(fanout exchange)等,以实现不同的消息路由和分发策略
元数据管理             :
高可用               : 通过镜像(mirror)机制来保证数据的可靠性,即每个队列可以有多个镜像分布在不同的节点上,如果某个节点发生故障,可以自动切换到其他节点

#### 一、 安装 

rabbitmq 和 erlang 版本支持对应关系
https://www.rabbitmq.com/docs/which-erlang
https://www.rabbitmq.com/docs/which-erlang#eol-series


历史版本不受支持,只能从github 下载 
https://github.com/rabbitmq/rabbitmq-server/releases?expanded=true&page=3&q=3.6.15
https://github.com/rabbitmq/erlang-rpm/releases   


rongcheng rabbitmq 版本是 3.6.15 ,对应erlang 最小版本是 19.3 ,最大是 20.3.x
rabbitmq 升级 
https://www.rabbitmq.com/docs/upgrade

 
systemctl start rabbitmq-server.service
systemctl status rabbitmq-server.service


1.准备
关闭防火墙

1.配置 hosts vim /etc/hosts
192.168.0.37 rabbitmq-1
192.168.0.38 rabbitmq-2
192.168.0.39 rabbitmq-3

2.同步.erlang.cookie   确保节点间可以通信
/var/lib/rabbitmq/.erlang.cookie

scp /var/lib/rabbitmq/.erlang.cookie  root@rabbitmq-2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie  root@rabbitmq-3:/var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie

3.重启
systemctl restart rabbitmq-server.service

4. 加入集群
# 节点2执行
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-1
rabbitmqctl start_app

# 节点3执行
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-1
rabbitmqctl start_app

# 同步策略,任意一台均可
rabbitmqctl set_policy ha-all "^." '{"ha-mode":"all"}'

5. 查询集群状态
rabbitmqctl cluster_status

6. 管理用户
rabbitmqctl add_user admin StrongPassword 
rabbitmqctl set_user_tags admin administrator   # 修改用户角色
rabbitmqctl set_permissions -p / admin “.*” “.*” “.*”  # 修改用户权限


# 9. web 控制台

启动RabbitMQ Web 控制台 
rabbitmq-plugins enable rabbitmq_management

关闭RabbitMQ Web 控制台 
rabbitmq-plugins disable rabbitmq_management

#### 二、集群 
https://www.rabbitmq.com/docs/clustering       # 最新版本
https://v3-12.rabbitmq.com/documentation.html  # 3.12版本

rabbitmq集群大概有五种方案:
1.普通集群
  -- 内容只存在其声明节点上。其他节点只存储元数据(如队列名称、绑定关系等)。当客户端连接到非队列所在节点并执行诸如消费消息的操作时,该节点会作为代理,将请求转发给实际持有队列的节点
    优点:资源利用效率高,因为消息不会被复制到所有节点。
    缺点:如果持有队列的节点宕机,该队列将不可用,直到节点恢复。
2.镜像集群(Quorum mirroring)
  -- 有一个主副本(master)和多个从副本(slave)。所有对队列的操作都首先在主副本上执行,然后异步复制到从副本。
  -- RabbitMQ 3.9 被弃用(4.0被完全启用),并建议使用Quorum队列和Streams作为替代
    优点:提高了可用性,因为如果主副本所在的节点失效,最老的从副本会被提升为新的主副本。
    缺点: 
        增加了网络带宽和磁盘空间的使用,因为每个消息都被复制到所有镜像。
        写入吞吐量可能下降,因为每个操作都需要被复制。
        在网络分区的情况下可能导致脑裂或数据丢失。
3.Quorum(仲裁)队列
  -- 3.8中引入,旨在克服镜像队列的一些问题。基于Raft共识算法,提供一致性保证。队列数据在奇数个节点(通常是3或5)之间复制。只要大多数节点(即quorum)可用,队列就能继续工作
    优点: 
      更好的故障处理:能更优雅地处理网络分区,减少数据丢失的风险。
      显式的故障转移:不像镜像队列中的隐式故障转移,Quorum队列中的leader选举是明确的。
      没有脑裂问题:由于使用了共识算法,即使在网络分区的情况下也能保证数据一致性。
    缺点: 
      由于需要在多数节点上达成一致,可能比镜像队列稍慢一些。
      不支持一些高级特性,如优先级队列、消息TTL等。
4.Streams集群模式(高可用+负载均衡)
  -- 3.9+ 最新引入的一种新型数据结构,借鉴了Apache Kafka的一些理念。消息以追加日志的形式存储,支持多消费者订阅,每个消费者维护自己的消费位置。
  -- 流由领导者和副本Erlang进程组成,分布在RabbitMQ集群的节点上
  -- 发布应用程序可以连接到任何节点,消息会自动转发到领导者进程所在的节点。而消费应用程序必须连接到包含流成员的节点,以利用sendfile优化
    优点: 
      持久化开销小,非常适合需要长期存储大量消息的场景。
      支持消息重放,消费者可以从任意位置开始消费。
      集群复制基于Raft算法,提供了类似Quorum队列的一致性保证。
 
5.插件方式
  -- Shovel Plugin 主要实现消息从一个 RabbitMQ集群(或单个节点)到另一个 RabbitMQ集群传输。通常用于地理上分散集群间传递消息,或要跨数据中心传递消息时使用。
  -- Federation Plugin 允许 RabbitMQ集群间动态消息共享。在不进行消息物理传输的情况下,可以在多个 RabbitMQ 集群之间共享消息流,通常用于构建更松散耦合的集群架构。
    

目前推荐使用的集群模式就是Quorum队列与Streams。 
Quorum队列支持高可用,而Streams模式即支持高可用集群又支持负载均衡集群。Quorum队列模式也可以借助HAproxy来支持负载均衡。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐