1

我们有三个使用 Spring cloud AWS kinesis binder 连接到 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

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

4

1 回答 1

0

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

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

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

于 2019-03-25T14:04:25.720 回答