RabbitMQ
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。你可以想象它是一个邮局。当你把信件放到邮箱里时,能够确信邮递员会正确地递送你的信件。RabbitMq就是一个邮箱、一个邮局和一个邮递员。
(MQ和redis在分布式系统中都是相当重要的角色)
消息中间件的作用
• 应用解耦
• 弹性伸缩
• 冗余存储
• 流量削峰
• 异步通信
• 数据同步
基本模型:
RabbitMQ的五种工作模式
1. 简单模式
原理:
生产者将消息交给默认的交换机,交换机获取消息后交给绑定这个生产者的队列(投递规则为队列名称和routing key 相同的队列),监听当前队列的消费者获取信息并执行消费逻辑。
使用的场景:
1.有一个oa系统,用户通过接收手机验证码进行注册,页面上点击获取验证码后,将验证码放到消息队列,然后短信服务从队列中获取到验证码,并发送给用户。
2.短信.聊天
2. 工作模式
原理:
生产者将消息交给交换机,交换机交给绑定的队列,队列有多个消费者监听,一条消息只能由一个消费者消费,这样就形成了资源竞争,谁的资源空闲大,争抢到的可能性就大。
场景:
1.有一个电商平台,有两个订单服务,用户下单的时候,任意一个订单服务消费用户的下单请求生成订单即可。不用两个订单服务同时消费用户的下单请求。
2.抢红包
3. 发布订阅 publish/subscribe
原理:
生产者将消息扔给交换机,交换机类型是fanout,不同的队列注册到交换机上,不同的消费注册在不同的队列上。所有消费者都会收到消息。
场景:
1.有一个商城,我们新添加一个商品后,可能同时需要去更新缓存和数据库
2.广告
需要注意的一点就是交换机没有保存功能,如果没有消费者,则消息会丢失。
4. 路由模式 routing
原理:
生产者将消息发送给交换机,消息携带具体的routingkey。交换机类型是direct,接收到消息中的routingkey,比对与之绑定的队列的routingkey,分发到不同的队列上。
场景:
有一个商城,新添加了一个商品,实时性不是很高,只需要添加到数据库即可,不用刷新缓存。
5. 主题订阅模式 topic
原理:
路由模式的一种,路由功能添加了模糊匹配。星号(*)代表1个单词,#号(#)代表一个或多个单词。
场景:
有一个商城,新添加了一个商品,实时性不是很高,只需要添加到数据库即可,数据库包含了主数据库mysql1和从数据库mysql2的内容,不用刷新缓存。