当前位置: 首页 > 知识库问答 >
问题:

Apache Kafka分区保证中的消息顺序

孟浩然
2023-03-14

阅读这篇关于主题分区中消息排序的文章:https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2

允许在不设置最大值的情况下重试。航班请求。每连接到1可能会更改记录的顺序,因为如果将两个批发送到单个分区,第一个失败并重试,但第二个成功,则第二个批中的记录可能会首先出现。

根据它,有两种类型的生产商配置可以实现订购保证:

max.in.flight.requests.per.connection=1 // can impact producer throughput

或替代方案

enable.idempotence=true
max.in.flight.requests.per.connection //to be less than or equal to 5
max.retries // to be greater than 0
acks=all

有人能解释一下第二种配置是如何实现订单保证的吗?在第二个配置中,语义只启用一次。

共有2个答案

长孙嘉
2023-03-14

<代码>启用。幂等性是一种较新的设置,作为kip-98的一部分引入(在Kafka0.11中实现)。在此之前,用户必须将max.inflight设置为1。

它的工作方式(缩写)是生产者现在将序列号放在我们正在进行的生产批次上,并且经纪人跟踪每个连接到他们的生产者的序列号。如果经纪人收到一个乱序的批次(例如1之后的第3批),它会拒绝它并期望看到第2批(生产者将重新传输)。有关完整的详细信息,您应该阅读kip-98

颛孙品
2023-03-14

幂等性:(每分区一次语义学)

幂等传递使生产者能够在单个生产者的生命周期内仅向主题的特定分区写入一次Kafka消息,而不会丢失数据和每个分区的顺序。

幂等性是在Kafka中实现精确一次语义学的关键特性之一。设置“enable.idempotence=true”最终会在每个分区获得精确一次语义学,这意味着特定分区没有重复,没有数据丢失。如果发生错误,即使生产者多次发送消息也会被写入Kafka一次。

Kafka生产者PID和序列号的概念来实现幂等,如下所述:

PID和序列号

幂等生产者在生成消息时使用产品ID(PID)和序列号。生产者不断增加发布的每条消息的序列号,该消息映射了唯一的PID。代理总是将当前序列号与前一个序列号进行比较,如果新序列号不大于前一个序列号,则拒绝,以避免重复,同时如果大于显示丢失在消息中。

在失败的情况下,它仍然会保持序列号并避免重复,如下所示:

注意:当生产者重新启动时,将分配新的PID。因此,幂等性只promise用于单个生产者会话

如果您使用的是启用。幂等性=true可以保持max.in。航班请求。每连接多达5个,您可以实现订单保证,从而带来更好的并行性并提高性能

Kafka 0.11中引入的幂等特性,然后我们可以通过重试和Acks设置实现某种级别的保证使用max.in.flight.requests.per.connection:

max.in.flight.requests.per.connection to 1
max.retries bigger number
acks=all

最大英寸。航班请求。每连接=1:确保在消息重试时不会发送其他消息。

这至少提供了一次保证,并带来了性能和吞吐量方面的成本,这就是鼓励引入的enable。幂等性功能可提高性能,同时保证排序。

exactly\u once:为了实现exactly\u once和幂等性,我们需要将事务设置为read\u committed,并且不允许覆盖以下参数

>

  • 隔离。级别:read\u committed(使用者将始终仅读取提交的数据)

    enable.idempotence=true(生产者将始终启用幂等)

    MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION=5(生产者每次连接总是有一个正在运行的请求)

  •  类似资料:
    • 我已经在kafka上工作了相当长的六个月,我对用户延迟和存储到主题分区中的数据有一些疑问。 问题1:最初,当我开始阅读Kafka并了解如何使用Kafka的功能时,我被教导说,一个只有一部分和一个复制因子的主题会创造奇迹。经过相当长的六个月的工作,将我的项目迁移到live之后,使用我的主题消息的消费者开始给我一个延迟。我阅读了许多关于消费者延迟的堆栈溢出答案,得出结论,如果我增加某个主题的分区和复制

    • 主要内容:面试题剖析,解决方案面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。 你在 mysql 里增删改一条数据,对应出来了增删改

    • 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。 面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -

    • 根据Apache Kafka文档,消息的顺序可以在一个分区或一个主题中的一个分区内实现。在这种情况下,我们得到的并行性好处是什么,它相当于传统的MQ,不是吗?

    • 我正在评估用作事件总线的不同流媒体/消息服务。我正在考虑的一个方面是每项服务提供的订购保证。我正在探索的两个选项是AWS Kinesis和Kafka,从较高的层次来看,它们似乎都提供了类似的订购保证,其中记录保证以仅在该碎片/分区中发布的相同顺序使用。 AWS Kinesis API似乎公开了父分片的id,因此使用KCL的消费者组可以确保具有相同分区键的记录可以按照发布顺序(假设是单线程发布者)被

    • 好吧,我对servicebus还比较陌生。在一个项目中,我们使用Azure servicebus对消息进行排队。我们的架构大致如下所示: 因此,我们的想法是,在我们的源系统中,发生了各种各样的事情,这导致消息被放在servicebustopics上。现在,我们的责任是将这些事件同步到外部客户机,以便他们知道我们在做什么。 现在的问题是,目前我们不使用servicebus会话,所以消息顺序无法保证。