如何检测到消息丢失?
美团消息队列文章中提到了对消息队列的监控手段,我理解消息丢失,根据不同节点来查看监控:
- 生产者生产丢失:监控中生产者生产量异常
- 消费者消费丢失:查看消费者消息延迟监控、消费者 offset 偏移
消息队列高手课中提到的检测方法是:消息队列中的有序性。具体来说,生产消息时附带一个递增 id,消费方消费时检查这个 id。这个方法的困难还是很多的,日常工作中感觉不太可用
- 需要保证消息在 topic 中严格有序(kafka 只能保证在 分区 是有序的)
- 多个不同的 producer 也需要保证消息的有序性
- consumer 检测消息的有序性(consumer 和分区一一对应可能相对方便)
kafka 如何保证「消息可靠」
什么是 kafka 认为的「消息可靠」?
kafka 保证对「已提交」的消息进行有限度的可靠性。
- 已提交:消息已经在 1-n 个 broker 上写到 日志 中
- 有限度:n 个 broker 不能同时全部挂掉,不然神仙难救。
防止消息丢失的方法
- 生产者消息丢失
- 场景
- kafka 中提供的 api send 方法是异步发送,此时 send 给你的返回值并不代表 mq 真正成功发送。上述的场景,严格来说并不是 kafka 要提供的消息可靠范围内
- producer 设置的 acks 数量过少,且 broker 发生异常导致消息消失,这个对应的就是 kafka 消息可靠的有限性。
- 使用建议
1. 使用 send 方法时已经要使用带有回调参数的producer.send(
- 场景