rabbitmq重连java rabbitmq 长连接_rabbitmq入门


大家好,欢迎收看猿话!

RabbitMQ是一套开源的消息队列服务软件,是AMQP协议的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,常用于系统解耦、异步通知、流量削峰等场景。

RabbitMQ的基本结构主要包括三部分:生产者、队列、消费者。如下:


rabbitmq重连java rabbitmq 长连接_rabbitmq几种工作模式_02


生产者主要负责生产消息,队列主要负责存储消息,消费者主要负责消费消息。

一般消息由生产到消费,要经历如下几个步骤:

  1. 生产者与Broker建立TCP连接
  2. 生产者和Broker建立通道channel
  3. 生产者通过通道将消息发送给Broker,由路由器Exchange将消息进行转发
  4. Exchange通过配置的路由规则,将消息转发到指定的队列Queue
  5. 消费者和Broker建立TCP连接
  6. 消费者和Broker建立通道channel
  7. 消费者监听指定的队列Queue
  8. 当有消息到达队列Queue时,Broker默认将消息推送给消费者
  9. 消费者接收到消息,并进行消费

RabbitMQ工作模式

RabbitMQ常用的工作模式有以下几种 :

  1. Simple简单模式
  2. Work工作模式
  3. Publish/Subscribe发布/订阅模式
  4. Routing路由模式
  5. Topic主题模式
  6. RPC模式

1、Simple简单模式


rabbitmq重连java rabbitmq 长连接_rabbitmq工作模式_03


简单模式主要适用于单机,在简单模式下,一个队列通常只有一个生产者和一个消费者,生产者将消息放入队列,消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉。消息被拿走后,自动从队列中删除消息。

缺点:消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失。

应用场景:聊天

2、Work工作模式


rabbitmq重连java rabbitmq 长连接_rabbitmq 持久化_04


工作模式是对简单模式的升级,在工作模式下,生产者将消息放入队列,多个消费者将同时监听同一个队列。多个消费者共同争抢当前的消息队列内容,谁先拿到谁负责消费消息。

为避免高并发情况下,某一个消息被多个消费者共同使用。可以设置一个开关,保证一条消息只能被一个消费者使用。

应用场景:红包,大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)

3、Publish/Subscribe发布/订阅模式


rabbitmq重连java rabbitmq 长连接_rabbitmq入门_05


生产者将消息放入交换机X,交换机X利用发布/订阅机制,将消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费。

应用场景:邮件群发、群聊天、广播(广告)

4、routing路由模式


rabbitmq重连java rabbitmq 长连接_rabbitmq几种工作模式_06


生产者将消息发送给交换机X,交换机X按照配置的路由规则进行判断,将消息转发到指定的消息队列,对应的消费者才能消费消息。

5、Topic主题模式

这种模式跟routing路由模式是一样的,只不过路由器匹配路由键时是模糊匹配。相对于路由模式,这种模式更灵活。

6RPC模式

这种模式的意思就是将RabbitMQ当作RPC框架来使用。

RabbitMQ如何防止数据丢失

RabbitMQ有四种防止消息丢失的机制:

  • 消息持久化
  • ACK确认机制
  • 设置集群镜像模式
  • 消息补偿机制

1、消息持久化

RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失。所以,要对消息进行持久化处理。

如何持久化,下面具体说明下:

要想做到消息持久化,必须满足以下三个条件,缺一不可。

1) Exchange 设置持久化

2)Queue 设置持久化

3)Message持久化发送:发送消息设置发送模式deliveryMode=2,代表持久化消息

2、ACK确认机制

在生产者发送消息到服务器,服务器将消息成功保存到队列后,要通知生产者。生产者如果没有收到ack确认,则需要重新发送消息。

消费者从队列获取消息,成功消费消息后,需要通知服务端,服务端收到ack确认后,才将消息从队列中删除

3、设置集群镜像模式

RabbitMQ有三种部署模式:

  • 1)单节点模式:最简单的情况,非集群模式,节点挂了,消息就不能用了。业务可能瘫痪,只能等待。
  • 2)普通模式:默认的集群模式,某个节点挂了,该节点上的消息不能用,有影响的业务瘫痪,只能等待节点恢复重启可用(必须持久化消息情况下)。
  • 3)镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案

为什么设置镜像模式集群?因为在镜像模式下,消息可以同步至多个节点,这样即使其中一个节点出问题了,也不会造成消息丢失。

4、消息补偿机制

虽然以上的三种方案,基本可以保证消息的高可用不丢失的问题,但要绝对保证系统的稳定性,还是需要有消息补偿机制。

比如:持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?

消息补偿机制需要将消息写入DB日志,然后,根据DB日志记录消息发送消费是否成功,如果不成功,则进行消息补偿措施,重新发送消息处理。