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

How to choose Kafka transactional.id in a Kubernetes (Producer side only transaction) set up

我有一个仅在生产端使用事务的 Kafka 包装器库。图书馆不涵盖消费者。生产者发布到多个主题。目标是实现事务性。因此,produce 要么成功,这意味着每个主题中应该只有一次消息副本,要么失败,这意味着消息没有写入任何主题。该库的用户是 运行 在 Kubernetes pods 上的应用程序。因此,pods 可能会失败,或频繁重启。此外,发送消息时不会明确设置分区。

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

这个策略有什么缺陷吗?有没有更聪明的方法来做到这一点?另外,我不能向图书馆用户询问某种 ID。

UUID 可以在您的库中用于为您的生产者生成交易 ID。我不太确定你的意思:这样,如果生产者由于 Pod 重启而终止,消费者不会永远锁定交易

消费者永远不会真正“卡住”。假设生产者在向一个主题写入消息后宕机(因此事务尚未提交),那么消费者将以下列方式之一进行操作:

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