1Questions
- 消息的投递和消费都有可能丢失,如何保证消息的可靠性(不丢失)?
- 同一个消息被投递多次,如何处理重复消息?
- 消息的发送顺序和消费顺序可能不一致,如何保证消息的有序性?
2Answers
2.1如何保证消息的可靠性
消息的可靠性由三方面组成:生产端可靠性、broker端可靠性、消费端可靠性。
生产端可靠性:必须处理broker的响应,确认消息已经成功写入。一旦写入broker失败,则无限重试。对kafka而言,设置retries=max。这种情况下,可能会导致broker收到重复的消息。
broker端可靠性:采用集群配置。一个消息收到后被写入所有副本后再返回成功。对kafka而言,设置ack=all,配置多个副本。
消费端可靠性:关闭手动提交,等本地业务逻辑执行完毕后再提交。
2.2如何处理重复消息
造成重复消息的原因是因为我们要求生产者确认broker的存储结果,但是由于网络波动造成broker的回包丢失。
处理重复消息的方法有两种:
- broker端去重:需要给每个消息标记,然后broker端去重。kafka下开启幂等发送可以保证单个分区内消息去重。
- 消费端接口幂等。只要消费端接口幂等,那么对同一个消息,多次执行也不会有影响。
2.3如何保证消息的有序性
由于前面的要求,即要保证消息的可靠性,broker一般都会做成集群模式。所以很难保证消息的全局有序性。
要满足消息去全局有序性,以kafka为例,一个topic只能有一个分区。这种情况下性能和可靠性都很低,一般不采取。
绝大部分时候,我们只需要分区有序性即可。
对kafka来说,有三种发送策略:指定分区发送、按key哈希后发送、轮询。采用第二种,即可实现分区的有序。
网友评论