消息丢失,消息重复消费,消息顺序消费等问题是我们使用 MQ 时不得不考虑的一个问题,下面我结合实际的业务来和你分享一下解决方案。
比如我们使用 Kakfa 时,以下场景都会发生消息丢失:
- producer -> broker (生产者生产消息)
- broker -> broker (集群环境,broker 同步给其他 broker)
- broker -> consumer (消费者消费消息)
解决方案也很简单,设置 acks(消息确认机制) retries(重试机制) factor(设置 partition 数量)...
一般来说,最常见的消息丢失场景就是: consumer 消费消息。
要保证 consumer 消费消息时不丢失消息,必须使用 手动提交 ack
我们业务是这样实现的:
要解决消息重复消费,也就是要实现 幂等(幂等就是:多次请求,但结果保持不变,举一个例子你就明白了: 在 http 中,你发送同一个 get 请求,无论发送多少次,返回结果都是一样的
)
回到我们的业务场景上,我以处理订单消息为例: