我们有三个容器连接到 Kinesis 流,作为消费者使用 Spring 云 AWS kinesis binder。我们使用使用者组在三个容器之间进行负载均衡。要求是集装箱分担负载,并且应能够均匀分配负载。
- 所有容器都使用来自配置服务器的相同应用程序配置
目前我们有如下配置。
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=
作为唯一值提供给每个实例,因此每个实例只会从流中获取自己的分片子集。否则,无法通过通用配置服务器区分它。