前几节将RabbitMQ的几种模型都学习了一下,这次来做个总结,同时给出一个实际应用的例子。
1.总结
简单队列

模型:一个生产者,一个队列,一个消费者
描述:消息将被唯一的消费者处理
生产者:使用默认的exchange,routingkey指定为queueName
消费者:监听queueName
work queue

模型:一个生产者,一个队列,多个消费者
描述:消息被消费者A OR 消费者B处理
生产者:使用默认的exchange,routingkey指定为queueName
消费者:多个消费者监听同一个queueName
其他重要概念
ack:消息确认
默认为true,表示Exchange在发送消息给消费者后,就认为收到了确认,将删除该消息;
如果为false,消费者需要在收到并处理消息之后,给MQ发送手动确认,MQ在收到确认后,才会将消息删除;
未收到确认时,仍会继续投递,只是所有消息都以unacknowledged的状态保存下来,待未发ack的消费者断连了,消息将重新投递给其他存活的消费者。
手动ack可以保证某一个消费者断连,消息将会发送给其他消费者,而不会丢失。
持久化:保证RabbitMQ挂了,队列中的消息仍能恢复。
需要队列声明时参数设为持久化,消息发送时属性设置为持久化。
basicQos: 只有在收到消费者的ack之后才会向该消费者投递下一条消息,否则会投递给其他收到ack的消费者。
可以实现能者多劳
exchange:从消费者接收消息,推送消息给队列,推送规则取决于exchange的类型
fanout:广播 select * from user;
direct:单播 select * from user where user_name = 'zhangsan';
topic:组播 select * from user where user_name like 'zhang%';
Publish/Subscribe

描述:广播,exchange取值fanout,消息被消费者A AND 消费者B处理
生产者:指定exchange类型为fanout,发消息给exchange,routingkey不指定
消费者:绑定队列到交换器,exchange会将消息推送给所有绑定的队列
Routing

描述:单播,exchange取值direct,消息将会发给routingKey完全匹配的队列
生产者:指定exchange类型为direct,发消息给exchange,同时指定routingkey
消费者:绑定队列到交换器,同时指定routingKey,exchange会将消息发给routingKey完全匹配的队列
topics

描述:组播,exchange取值topic,消息将会发给routingKey满足一定规则的队列,匹配规则:#匹配0个或多个单词 *匹配1个单词
生产者:指定exchange类型为topic,发消息给exchange,同时指定routingkey
消费者:绑定队列到交换器,同时指定routingKey,exchange会将消息发给routingKey满足一定规则的队列
2.实际应用
MQ的一个典型应用就是异步处理,比如用户注册后,需要给用户发邮件+发短信,可以先给用户响应注册成功,然后将发邮件+发短信的任务交给MQ来慢慢处理。这里有一个ES和MQ结合的例子,和上面注册+发邮件+发短信的思想差不多。
其他的使用场景,可以参考牧码人视频中的第一节课。
3.拓展阅读
推荐一篇美团技术团队的消息队列设计精要,真正的干货硬货,要慢慢嚼
网友评论