【问题标题】:How to produce messages with consecutive numbers with Kafka?如何用 Kafka 生成连续编号的消息?
【发布时间】:2021-05-08 17:02:01
【问题描述】:

上下文:发票系统,发送的发票必须有连续的数字。

每张发票都有一个唯一的发票编号,为简单起见,假设它们是 I1I2I3 等等。因此,系统中的第一张发票编号为I1,并且每下一张发票都会递增。然后,每张发票都在一个 Kafka 主题中生成。

所以,总能仅根据本主题的内容来计算下一张发票的编号,对吧? (主题中的发票数量 + 1 = 下一个数字)我们可以将这样的系统称为事件源。

但是你是如何做到这一点的呢?对我来说,这似乎是一个循环数据流:为了生成主题,我首先需要确保我在另一个地方消费了相同的整个主题。

我对事件流有什么误解,还是 Kafka 不可能?

始终为发票分配编号并逐一发送,而不是并行发送。

【问题讨论】:

    标签: apache-kafka event-sourcing event-driven event-driven-design event-stream-processing


    【解决方案1】:

    生产者不应该关心已经(或没有)消费了什么。

    您似乎只需要确保生产者有acks=1,这意味着代理接受了消息,并且您有一个分区来确保完整的排序。

    如果您需要确保跨分布式线程/进程以原子方式增加值,那么您将希望将该数字保存在其他地方,而不是依赖于主题的状态(例如,Zookeeper 锁)。

    【讨论】:

    • > 生产者不应该关心已经(或没有)消费了什么。杰普,这是真的。抱歉,acks=1 究竟是如何解决挑战的?我是这样想象的:发票生成后,我们要查询下一个连续的号码。为此,该主题被消耗并写入数据库(或者可能 ksql 发挥作用)。有可能在查询下一张发票时,最新生成的发票尚未进入数据库,因此生成了重复的编号。
    • 据我了解,acks=1保证了连续编号不出现空缺,这是一个重要的保证。我目前的想法是将该数字保存在关系数据库中(我可以在事务中原子地增加它),并且在服务开始时,使用整个主题并根据内容初始化数据库中的数字话题。它会算作事件溯源吗?
    • 如果 acks=-1,则不能保证编号是连续的或有序的。如果您有 acks=1 或全部,那么它不会防止间隙或防止重复,它只是确保数据被写入。而且我不认为在开始制作人之前消耗整个主题是一个好主意,但是如果您认为有必要,那就继续吧
    • 从某种意义上说,它是事件溯源,但有些数据存储比 Kafka 更适合事件溯源。
    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 2021-01-09
    • 2021-02-16
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多