消息模型
- 点对点
消息生产者向消息队列中发送一个消息之后,只能被一个消费者消费一次. - 发布/订阅
消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费. - 发布与订阅模式的观察者模式不同点
- 观察者模式中,观察者和主体都知道对方的存在.而在发布与订阅模式中,生产者与消费者不知道对方的存在,他们之间通过频道进行通信.
- 观察者模式是同步的,当事件触发时,主体会调用观察者的方法,然后等待方法返回.而发布与订阅模式是异步的,生产者只要向频道
发送一个消息后,就不需要关心消费者何时去订阅这个消息,可以立即返回.
使用场景
- 异步处理
发布者把消息发送给消息队列之后,不需要同步等待消息接收处理完毕,而是立即返回进行其他操作.消息接收者从消息队列中订阅信息之后异步处理.
eg:比方说我公司是做旅游的,需要通过渠道接口推送价格到渠道更新,这时候可以把价格发送到消息队列,接下的操作都是异步的,
价格推送到渠道更新这个行为操作在消息队列处理,不会影响我接下来的操作.
只有在业务流程允许异步处理的情况下才能这么做,如果是必须同步的,就不能再使用消息队列. - 流量削峰
在高并发的场景下,如果短时间有大量的请求到达会压垮服务器.
可以将请求发送到消息队列中,服务器按照其处理能力从消息队列中订阅信息进行处理.
eg:1.比方我们做旅游的,供应商端必会提供限流,比如20QPS,这时候如果超过的话会获取不到数据.这时候我们可以通过消息队列进行
处理,降低对接口的请求.2.记录日志方面,我们也可以通过消息队列进行日志写入. - 应用解耦
如果模块之间不直接进行调用,模块之间耦合度就会很低,那么修改一个模块或者新增一个模块对其他模块的影响会很小,从而实现可扩展性.
通过消息队列,一个模块只需要向消息队列中发送消息,其他模块可以选择性地从消息队列中订阅消息从而完成调用.
可靠性
- 发送端的可靠性
发送端完成操作后一定能将消息成功发送到消息队列中.无需关心接收端处理问题. - 接收端的可靠性
接收端能够从消息队列成功消费一次消息.以下两种方式:
- 保证接收端处理消息的业务逻辑具有幂等性.只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的.
- 保证消息具有唯一编号,并使用MYSQL/elk记录下日志消费信息.
评论区