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

消息队列若干问题

作者: 小怪兽狂殴奥特曼 | 来源:发表于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哈希后发送、轮询。采用第二种,即可实现分区的有序。

相关文章

  • 消息队列若干问题

    1Questions 消息的投递和消费都有可能丢失,如何保证消息的可靠性(不丢失)? 同一个消息被投递多次,如何处...

  • 消息队列:消息队列简介

    1. 什么是消息队列 消息队列(message queue),是一种应用程序的通信方法; 消息队列是 生产者-消费...

  • 消息中间件

    消息中间件,也可以叫做中央消息队列或者是消息队列(区别于本地消息队列,本地消息队列指的是 JVM 内实现的队列实现...

  • 消息队列对比

    引用: 常用消息队列对比消息队列及常见消息队列介绍 常用消息队列 1. RabbitMQ 用erlang语言开发的...

  • 消息队列应用-使用异步队列就解耦了吗

    消息队列作用一文介绍了为什么要使用消息队列。我们再来讨论下如何有效使用消息队列。 消息队列模式 目前主流消息队列主...

  • Kafka常见问题解决

    概要:我们使用消息队列,就需要知道为什么要用消息队列,什么场景需要用消息队列,使用消息队列能带来哪些好处和消息队列...

  • 进程间通信(下)

    消息队列 在UNP第二卷中详细介绍了两种消息队列:Posix消息队列和System V消息队列。这两种消息队列很相...

  • APUE读书笔记-15进程内部通信(6)

    7、消息队列 消息队列是存放在内核中的消息的链表,通过消息队列标识进行标记。我们把消息队列称为队列,把它的标识称为...

  • java消息机制

    1.什么是消息队列? 1.消息队列是一个队列,先进先出,你无法读取消息队列中间的消息,只能按照顺序,从消息队列的头...

  • springboot项目架构(4)activemq、rabbit

    消息队列实现 支持的消息队列 ActiveMq RabbitMq RocketMq Kafka 各个队列实现队列与...

网友评论

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

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