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

时间:2019-03-24 08:43:16

标签: spring-cloud-stream spring-cloud-aws spring-integration-aws

我们有三个使用Spring Cloud 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

由于我们使用同一台配置服务器,因此请您帮忙确保实现负载平衡。

1 个答案:

答案 0 :(得分:0)

首先,如果您在项目中使用DynamoDB,将创建一个export { toLower as stringToLower, toUpper as stringToUpper, } from "stringUtils.js"; export { propertyMap as objectPropertyMap } from "objectUtils.js"; bean,以允许所有实例访问对每个分片的独占访问权的共享数据。因此,只有一个实例将能够使用一个分片中的记录。

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

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