美文网首页
消息队列若干问题

消息队列若干问题

作者: 小怪兽狂殴奥特曼 | 来源:发表于2020-09-16 17:06 被阅读0次

    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哈希后发送、轮询。采用第二种,即可实现分区的有序。

    相关文章

      网友评论

          本文标题:消息队列若干问题

          本文链接:https://www.haomeiwen.com/subject/fthhyktx.html