如何在Kubernetes(仅生产者端事务)设置中选择Kafka transactional.id

如何在Kubernetes(仅生产者端事务)设置中选择Kafka transactional.id,kubernetes,apache-kafka,kafka-transactions-api,Kubernetes,Apache Kafka,Kafka Transactions Api,我有一个Kafka包装库,它只在产品端使用事务。图书馆不包括消费者。制作人发布多个主题。目标是实现事务性。因此,生成要么成功,这意味着每个主题中应该有一个消息副本;要么失败,这意味着消息没有写入任何主题。库的用户是在Kubernetes吊舱上运行的应用程序。因此,吊舱可能会出现故障,或频繁重启。此外,在发送消息时不会显式设置分区 我的问题是,我应该如何为生产者选择transactional.id?我的第一个想法是在对象启动时简单地选择UUID,并将transaction.timeout.ms设置

我有一个Kafka包装库,它只在产品端使用事务。图书馆不包括消费者。制作人发布多个主题。目标是实现事务性。因此,生成要么成功,这意味着每个主题中应该有一个消息副本;要么失败,这意味着消息没有写入任何主题。库的用户是在Kubernetes吊舱上运行的应用程序。因此,吊舱可能会出现故障,或频繁重启。此外,在发送消息时不会显式设置分区

我的问题是,我应该如何为生产者选择transactional.id?我的第一个想法是在对象启动时简单地选择UUID,并将transaction.timeout.ms设置为合理的时间(几秒钟)。这样,如果生产者由于pod重启而终止,消费者就不会永远锁定事务


这个策略有什么缺陷吗?有没有更聪明的方法?此外,我不能要求库用户提供某种id。

UUID可以在库中用于为生产者生成事务id。我不太清楚你的意思:那样的话,如果一个制作人因为pod重启而被终止,消费者就不会永远锁定交易

消费者从未真正“卡住”。假设制作人在向一个主题写入消息后下楼(因此交易尚未提交),则消费者将以以下方式之一行事:

  • 如果
    isolation.level
    设置为
    read_committed
    ,消费者将永远不会处理该消息(因为消息未提交)。它仍将读取下一条提交的消息
  • 如果
    isolation.level
    设置为
    read\u uncommitted
    ,则消息将被读取和处理(首先会破坏事务的目的)