Java Spring Boot Kafka侦听器不一致

Java Spring Boot Kafka侦听器不一致,java,spring-boot,kubernetes,apache-kafka,spring-cloud,Java,Spring Boot,Kubernetes,Apache Kafka,Spring Cloud,我试图让几个不同的Spring云微服务都连接到一个Kafka/Zookeeper集群,都在Kubernetes内。微服务使用org.springframework.kafka:springkafka——作为事件的消费者和生产者 所有的服务都连接到卡夫卡-好的-主题被创建;然而,每项服务的消费者都非常不一致 例如,当服务启动一次时,所有使用者都将侦听消息并调用函数。但是,当我重新启动一切(包括卡夫卡和zookeeper)时,它要么不起作用,要么不同服务中的一些消费者会起作用等等 下面是我的一些配置

我试图让几个不同的Spring云微服务都连接到一个Kafka/Zookeeper集群,都在Kubernetes内。微服务使用
org.springframework.kafka:springkafka
——作为事件的消费者和生产者

所有的服务都连接到卡夫卡-好的-主题被创建;然而,每项服务的消费者都非常不一致

例如,当服务启动一次时,所有使用者都将侦听消息并调用函数。但是,当我重新启动一切(包括卡夫卡和zookeeper)时,它要么不起作用,要么不同服务中的一些消费者会起作用等等

下面是我的一些配置(我没有任何基于Java的配置),只在我的application.yml中,如下所示:

spring:

  ....

  kafka:
    consumer:
      bootstrap-servers: api-kafka.default.svc.cluster.local:9092
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      group-id: api-event
      enable-auto-commit: false

    producer:
      bootstrap-servers: api-kafka.default.svc.cluster.local:9092
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      ack-mode: manual

...

我的主要课程是:

@EnableCaching
@SpringBootApplication
@EnableJpaRepositories
@EnableDiscoveryClient
@EnableKafka /* <<<<<<<------------- ENABLED HERE */
public class ExampleServiceApplication {

  public static void main(String[] args) {
    SpringApplication.run(ExampleServiceApplication.class, args);
  }

  .....
}

消息会被发送到代理,但不会被其他服务使用

我意识到没有映射到每个服务属性上的主题,如何通过application.yml实现这一点


我打赌我犯了一个很大的错误,但是是的!我非常感谢您的任何评论或帮助

顺便说一句,您可以在这里阅读更多关于分区数量和并行使用者(具有相同组id的使用者)数量之间关系的信息

稍微简化一下,应用程序可以运行的最大并行度受最大流任务数的限制,而最大流任务数本身由应用程序从中读取的输入主题的最大分区数决定。例如,如果输入主题有5个分区,那么最多可以运行5个应用程序实例。这些实例将协作处理主题的数据。如果运行的应用程序实例数大于输入主题的分区数,“多余”的应用程序实例将启动,但保持空闲;但是,如果其中一个繁忙实例停止工作,则其中一个空闲实例将恢复前者的工作。我们在FAQ中提供了更详细的解释和示例


你的卡夫卡主题有多少个分区?如果您有一个分区,那么只有一个服务使用消息是正常的。如果希望更多的服务并行使用主题消息,则需要增加分区数。@OctavianR。哦,好吧-有趣-我不知道!据我所知,我只有一个分区为所有的服务,所以可能是它。。。我想我需要定义具有NewTopic类型的javabean,并使用适当数量的分区构建主题。谢谢你的评论-我现在就试试,但是每个实体都有不同的主题,事件类型是字段等…-但这不应该影响太多,根本不重要。我在minikube本地运行我的服务时,正在阅读confluent docs atm。我目前拥有每个服务的1个副本,但假设每个服务有2个副本-这篇文章是说我可以还是它不能-或者它只是在需要之前闲置?你可以拥有它,但是超过分区数的消费者将保持闲置,非常感谢你的帮助-只需再做一些测试,我会正确标记你的答案!
@Component
public class MessageListener {

  @KafkaListener(
      topics = "myTopic")
  public void eventListener(String serializedMessage) {
    try {
....