Spring Cloud Aws kinesis Binder 组中的所有 JVM 以不同的时间间隔使用相同的消息

Spring Cloud Aws kinesis Binder All JVMs in group consume same message at different intervals

我们有三个容器作为消费者使用 Spring 云 AWS kinesis 绑定器连接到 Kinesis 流。 我们使用消费者组在三个容器之间进行负载平衡。要求是容器分担负载,负载要能均匀分布。

  1. 所有容器都使用来自配置服务器的相同应用程序配置

目前我们有如下配置。

spring:
  cloud:
    stream:
      bindings:
        MyStream:
          group: my-group
          destination: stream-1
          content-type: application/json

所有容器都在使用相同的消息,但在不同的时间(相差 5 到 10 分钟)

根据文档,

单个消费者组内的静态分片分布 可以在单个消费者组中的所有实例之间均匀分布分片。这通过配置完成:

spring.cloud.stream.instanceCount= to number of instances

spring.cloud.stream.instanceIndex= current instance’s index

由于我们使用相同的配置服务器,请问如何确保实现负载平衡。

首先,如果您在项目中使用 DynamoDB,将创建一个 DynamoDbLockRegistry bean 以允许所有实例访问关于对每个分片的独占访问的共享数据。因此只有一个实例能够使用一个分片中的记录。

可能只有一个实例会从一个流中获取所有分片,但看起来同一条记录可能不会进入另一个实例。

对于 spring.cloud.stream.instanceIndex 您可以将其作为 JVM arg 提供:-Dspring.cloud.stream.instanceIndex= 对于每个实例作为唯一值,因此每个实例将从流中仅获取其自己的分片子集。否则无法通过通用配置服务器区分它。