如何设计消息队列
消息队列主要有哪些应用场景
- 解耦(最主要):上下游消息均通过MQ交互而非直接交互,如上游订单模块的订单完成消息仅需将消息发送至MQ,下游积分模块也仅需读取MQ,如果后续添加账单分析模块也仅需与MQ交互;解耦的前提是上游(消息生产者)不关心下游(消费者)的处理结果
- 削峰:下游系统可以根据自身处理能力从MQ中消费消息,如大量的web请求可以写入消息队列中,下游数据库按自身处理能力消费
- 异步:多个不同的下游系统可以同时消费同一条消息;多个相同下游消费不同消息
如何保证消息不丢失
- 生产者发送并重试消息直到MQ返回ACK
- MQ保证消息写入磁盘后才返回ACK(防止消息在page cache时丢失)
- 消费者消费成功后ACK