RabbitMQ六大模式

简单队列模式

不用显示声明交换机,只需声明一个队列,只有一个消费者
问题:如果任务量很大,消息得不到及时的消费会造成队列积压,问题非常严重,比如内存溢出,消息丢失等。
解决:配置多个消费者消费消息。

工作队列模式

有俩种分发方式。

工作模式队列-消息轮询分发(Round-robin)

其中默认的轮询分发方式,就是采取一人一条的顺序执行来消费消息的。两个消费者得到的消息数量是相等的,从消费者1先消费完,然后才轮到消费者2消费。并不会因为两个消费者的处理速度不一样使得两个消费者处理的消费信息量不一样。从mq界面可以看到,虽然mq中的消息很快就没有了,但是消费者依然在处理消息,这种轮询的分发方式存在着很大的隐患。

工作模式队列-消息公平分发(fair dispatch)

刚刚消息应答采用的自动应答模式,我们可以通过一定的配置,改变消息的应答模式,消费者设置每次从队列里取出一条数据,并且关闭自动回复机制,在每次处理完数据后手动给队列发送确认收到的数据,这样队列就会公平给消费者发送数据。这种方式就是能力越大责任越大。谁能干就给谁分配的多

发布订阅模式

模式需要显示声明交换机,然后可以创建多个队列和这个交换机进行绑定。多个消费者消费的不再是同一个队列,而是每个消费者消费属于自己的队列。

生产者发消息给mq时需要指定交换机,然后交换机将消息转发给与自己绑定的所有队列,消费者监听指定的队列获得消息。

路由器模式

生产者产生的消息所有消费者都可以消费,可不可以指定某些消费者消费呢?就引入Routing-路由模式队列。

  1. 生产者也是把产生的消息投给交换机
  2. 交换机投送消息时的Exchange Types为direct类型

Topics-主题模式队列

生产者产生的消息如果场景需求过多需要设置很多路由规则,可不可以减少?采用topic主题模式。
来对消息进行匹配路由
这个模式引入routing key中存在两种特殊字符 * 与 # ,用于做模糊匹配,
其中 * 用于匹配一个单词, # 用于匹配多个单词(可以是零个)

一般用的最多的就是主题队列,因为主题队列集成了前面的队列的所有功能

RabbitMQ本身是基于异步的消息处理,是否可以同步实现?
:采用RPC模式。

RPC-远程过程调用模式队列

但实际的应用场景中,我们很可能需要一些同步处理、RPC-远程过程调用模式队列可以帮我们做到

RabbitMQ消息的事务机制

我们是怎么把这个消息送到消息队列里呢,
RabbitMQ为我们提供了两种方式:

  • 通过AMQP事务机制实现,这也是AMQP协议层面提供的解决方案;
    RabbitMQ中与事务机制有关的方法有三个: txSelect() , txCommit() 以及txRollback(), txSelect() 用于将当前channel设置成transaction模式, txCommit() 用于提交事务, txRollback() 用于回滚事务,

通过AMQP协议层面为我们提供了事务机制解决了这个问题,但是采用事务机制实现会降低RabbitMQ的消息吞吐量,降低他的性能

  • 通过将channel设置成confirm模式来实现;
    confrim模式是一种异步的模式,一旦发布一条消息,生产时就可以等信道返回确认发布下一条,
    当消息最终得到确认之后,生产者通过回调方法来处理该确认消息
    如果消息丢失了,就会发送nack消息,生产者可以在回调方法中处理这个nack消息

你可能感兴趣的:(Java高级,rabbitmq)