Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot Kafka:对特定主题的所有实例使用相同的消息_Spring_Spring Boot_Apache Kafka - Fatal编程技术网

Spring Boot Kafka:对特定主题的所有实例使用相同的消息

Spring Boot Kafka:对特定主题的所有实例使用相同的消息,spring,spring-boot,apache-kafka,Spring,Spring Boot,Apache Kafka,我有一个spring boot应用程序(我们称之为app-1),它连接到一个kafka集群,并从一个特定的主题(我们称之为“foo”)进行消费。当另一个应用程序(比如称为app-2)将新的foo项导入数据库时,topicfoo总是会收到一条消息。 该主题主要用于第三个应用程序(我们称之为app-3),该应用程序向可能对这个新的foo项目感兴趣的人发送一些电子邮件通知。App-3是集群的,这意味着它有多个实例同时运行。Kafka会自动在所有这些实例之间平衡foo主题消息,因为它们使用相同的消费者i

我有一个spring boot应用程序(我们称之为app-1),它连接到一个kafka集群,并从一个特定的主题(我们称之为“foo”)进行消费。当另一个应用程序(比如称为app-2)将新的foo项导入数据库时,topicfoo总是会收到一条消息。 该主题主要用于第三个应用程序(我们称之为app-3),该应用程序向可能对这个新的foo项目感兴趣的人发送一些电子邮件通知。App-3是集群的,这意味着它有多个实例同时运行。Kafka会自动在所有这些实例之间平衡foo主题消息,因为它们使用相同的消费者id。这很好,对于app-3来说,这实际上是需要的

但是,在app-2中,来自foo主题的消息用于缓存逐出。基本上,逻辑是,如果有一个新的foo项,那么应该清除当前存在的缓存,因为它们的内容取决于foo项。问题是app-2也是集群的,这意味着默认情况下kafka逻辑,每个实例将只接收发送到foo主题的一些消息。对于这个特定的应用程序tho,这是不正确的,因为每当有一个新的foo项时,所有实例都需要知道它,因为它们都需要清除本地缓存

据我所知,如果我想保持当前逻辑,我有以下两种选择:

  • 为app-2的所有实例引入分布式缓存,以便它们共享相同的缓存。那么,如果只有一个实例接收到一个foo项,这并不重要,因为缓存逐出也会影响其他实例的缓存;尽管他们从来没有听说过食物。我希望避免使用这种解决方案,因为分布式缓存会增加显著的复杂性和开销
  • 以某种方式设法为每个app-2实例使用不同的消费者id。然后,卡夫卡会将他们视为不同的消费者,他们都会收到每一条foo主题信息。然而,我甚至不知道如何通过编程实现这一点。应用程序的代码不知道复制的实例,无法访问关于它是什么节点的任何信息。如果我在启动时使用随机生成的字符串,那么每次这样的实例重新启动时,它都会被视为一个新的使用者,并且必须重新处理以前的所有消息。这也是不正确的行为

下面是我的底线问题:是否有可能让app-2的所有实例接收来自foo主题的所有消息,而不完全破坏卡夫卡的工作方式?我知道使用kafka消息进行缓存逐出可能是非常不传统的,我完全能够为缓存逐出逻辑找到一种不依赖于kafka主题消息的替代机制。然而,这些应用程序只是为了演示,我认为如果不止一个应用程序阅读了这个主题,那就太酷了。但是,如果我最终不得不破解一个肮脏的解决方法来让它工作,那么它对于演示来说也是不好的,我宁愿实现另一种缓存逐出的方法

如您所述,您可以使用随机字符串的不同消费者ID


如果从一开始就读取通知,则您可能已在消费者配置中的某个位置将
ConsumerConfig.AUTO\u OFFSET\u RESET\u CONFIG
设置为
“最早的”
。如果是这种情况,删除它可能会解决您的问题-当应用程序启动时,它只会在消费者开始监听后收到发送的通知。

对于这个特定的用例来说,这听起来确实是个好主意。由于这些消息仅用于缓存破坏,因此在实例未运行时,app-2是否错过发送的消息并不重要。我将尝试一下,看看它是否如您所描述的那样工作。如果是这样,那么这就回答了我的问题,我会接受你的回答!