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

Spring cloud stream Spring Cloud Aws kinesis Binder组中的所有JVM以不同的间隔使用相同的消息,spring-cloud-stream,spring-cloud-aws,spring-integration-aws,Spring Cloud Stream,Spring Cloud Aws,Spring Integration Aws,我们有三个容器连接到Kinesis stream,作为使用Spring cloud AWS Kinesis binder的消费者。 我们已经使用消费者组在三个容器之间进行负载平衡。要求集装箱分担荷载,并能均匀分配荷载 所有容器都使用配置服务器中的相同应用程序配置 目前我们有如下配置 spring: cloud: stream: bindings: MyStream: group: my-group destinati

我们有三个容器连接到Kinesis stream,作为使用Spring cloud 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参数提供给每个实例:
    -dsspring.cloud.stream.instanceIndex=
    ,作为唯一值,因此每个实例将只从流中获取自己的碎片子集。否则,无法通过公共配置服务器对其进行区分。

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

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


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

    谢谢。我猜我们的应用程序中没有StreamListener,消息作为Trasnformer(输入)直接发送到Transformer,可能是因为这个原因,问题出现了。在安装StreamListener之后,一切都很好。谢谢Artem。我猜我们的应用程序中没有StreamListener,消息作为Trasnformer(输入)直接发送到Transformer,可能是因为这个原因,问题出现了。在放置StreamListener之后,一切都很好。