rabbitMq(1.工作模式)
RabbitMq学习小结
一:工作模式
1.简单模式
一个消息队列一个发送者一个消费者
2.Work模式
A: 轮询分发Round-Robin(轮询)
特点:一次性分发任务,每个消费者获得的任务是等量的。
优点:可以轻易的并行工作,如果任务过多可以通过增加消费者来处理任务,系统的伸缩性更容易。
缺点:每个消费者的任务数量是相等的,如果存在每个任务的工作量不一致,就会出现有的消费者一直处于繁忙状态,有的消费者处于闲置状态,因为在分发任务的时候,并不了解这些,有消息进来,rabbitmq只会根据消息数量公平分发,不会看消费者的应答情况。
B: 公平分发
特点:任务是一个一个的派发,消费者处理完了给出响应才会继续派发下一个任务。
优点:有效的解决的轮询分发中工作量不均等的问题,可以确保每个消费者的工作量相等。
缺点:当消费者出现问题的时候,会出现消息积压的情况。
代码说明:
生产者:
// 同一时刻服务器只会发一条消息给消费者
channel.basicQos(1);
消费者:
// 同一时刻服务器只会发一条消息给消费者
channel.basicQos(1);
// 监听队列,false表示手动返回完成状态,true表示自动
channel.basicConsume(WORK_QUEUE_NAME, false, consumer);
// 返回确认状态,注释掉表示使用自动确认模式 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
/*声明队列
* 参数1:队列名称
* 参数2:设置是否持久化。为 true 则设置队列为持久化。持久化的队列会存盘,在 服务器重启的时候可以保证不丢失相关信息。
* 参数3:设置是否排他。为 true 则设置队列为排他的。如果一个队列被声明为排 他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。这里需要注意 三点:排他队列是基于连接( Connection) 可见的,同 个连接的不同信道 (Channel) 是可以同时访问同一连接创建的排他队列; "首次"是指如果 个连接己经声明了 排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队 列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列 适用于一个客户端同时发送和读取消息的应用场景。
* 参数4:设置是否自动删除。为 true 则设置队列为自动删除。如果一直没有消费者连接这个队列,不会自动删除;如果有消费者连接这个队列,当所有消费者都断开连接的时候,会自动删除。(当队列的消息没有被消费时,不会删除;当消息消费了,且消费者都断开了,会自动删除)
* 参数5:设置队列的其他一些参数,如 x-rnessage-ttl 、x-expires 、x-rnax-length 、x-rnax-length-bytes、 x-dead-letter-exchange、 x-deadletter-routing-key 、 x-rnax-priority 等。
*/
channel.queueDeclare(WORK_QUEUE_NAME, false, false, false, null);
/*参数1:交换机名称
*参数2:队列名称,路由关键字
*参数3:消息路由头等的其他属性
*参数4:消息内容
*/
channel.basicPublish("", WORK_QUEUE_NAME, null, message.getBytes());
3. 消息的确认模式
模式1:自动确认
只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。
模式2:手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。
图1:消费者只消费没有反馈消息状态
图2:消费者只消费没有返回状态,然后断开连接
图3:消费者消费且确认状态
4.订阅模式(fanout)
1.解析:
a、1个生产者,多个消费者
b、每一个消费者都有自己的一个队列
c、生产者没有将消息直接发送到队列,而是发送到了交换机
d、每个队列都要绑定到交换机
e、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
2.注意:
a.一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费
b. 消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。
测试结果:
同一个消息被多个队列获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费到消息。
3.代码
a.生产者
b.消费者
4.特点分析
a.一个生产者,多个消费者
5.路由模式(direct)
1.解析:
a:生产者向交换机发送消息,并给指定消息的key
b:消息者根据业务场景,绑定对应的消息key
c:一个队列可以绑定多个消息key
d:交换机如果没有队列与其绑定,消息将会丢失
e:交换机有队列与其绑定,但是没有消费者,消息不会丢失
2.特点分析:
a:一个消息只能由一个消费者消费
3.代码
生产者:
消费者:
6.主题模式(通配符模式)
1.解析:
-
- 主题模式与路由模式相似,都是根据消息key来消费消息
- 主题模式的两个符合
①*(星号)仅代表一个单词
②#(井号)代表任意个单词
举例:update.* 可以获取到生产者发出的key为 update.1 update.2 等消息
Update.# 可以获取到生产者发出的key为 update.1 update.1.1.1.1 等消息
2.特点分析:
-
- 可以定义一类消息,将key灵活运用
3.代码
生产者:
消费者:
参考链接:https://blog.****.net/hellozpc/article/details/81436980