Kafka
约 437 字大约 1 分钟
2026-05-18
Q: 如何保证消息不丢失?
消息生产段:设置 acks=all 确保所有副本都写成功才返回,并设置 retries 大于 0 ,失败自动重试。
Broker 端:设置 min.insync.relicas 设置为 2,确保至少有一个 Leader 和一个副本同时确认信息,并且设置 unclear.leader.election.enable 为 false,避免 Leader 宕机的时候一个落后很多的副本被选上。
消费端:我采用手动提交偏移量,业务处理成功之后,才调用 ackowledgement.ackowledge() 。如果抛异常,消息就不会被确认,后面会再拉取到,这样整个链路就闭环了,不会有没确认被消费的情况。
Q: 如何保证消息不重复?
每个消息都会包含一个唯一的 event_id。
消费端维护一个消息消费表,包含 event_id 和 create_time。消息进入时会被事物所包裹,先插入表,成功则没消费,失败则消费过了,直接返回。业务出了异常后续也能修复。
Q: 如何保证消息顺序?
kafka 只在一个分区内确保消息有序,大多数场景不需要严格有序,依靠幂等性来解决。
需要有严格顺序的只能设置同一个主题同一个分区,然后用单线程消费即可。
Q: 消费端挂了消息积压怎么办?
1、快速扩容,增加消费者。
2、找到瓶颈做降级、例如统计模块占用时间很长,就暂时关闭统计模块,记录原始数据,随后再补齐。
3、极端兜底:积压的消息已经过时且对业务无影响的时候,直接重置 offset 到最新,舍弃旧消息。
版权所有
版权归属:FelixJY
