在批处理模式下使用消息时,Spring Aws Kinesis Binder ProvisionedThroughputExceededException

时间:2019-04-09 13:53:27

标签: amazon-dynamodb spring-cloud-stream amazon-kinesis spring-cloud-aws spring-integration-aws

我正在使用批处理模式从kinesis流中提取记录。我们正在使用春季awes运动粘合剂。

在大多数情况下,我们无法从流中提取消息。只有有时候我们才能从流中提取消息。

我的配置如下所示

我的配置

spring:
  cloud:
    stream:
      kinesis:
        binder:
          locks:
            leaseDuration: 30
            readCapacity: 1
            writeCapacity: 1
          checkpoint:
            readCapacity: 1
            writeCapacity: 1
        bindings:
          InStreamGroupOne:
            consumer:
              listenerMode: batch
              idleBetweenPolls: 30000
              recordsLimit: 5000
              consumer-backoff: 1000
      bindings:
        InStreamGroupOne:
          group: in-stream-group
          destination: stream-1
          content-type: application/json
        OutboundStreamOne:
          destination: stream-2
          content-type: application/json
        OutboundStreamTwo:
          destination: stream-3
          content-type: application/json
        OutboundStreamThree:
          destination: stream-4
          content-type: application/json

启用调试日志记录后,我可以看到此异常

Received error response: com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputExceededException: The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API. (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ProvisionedThroughputExceededException; 

我尝试将批量大小减小为150,并将idleBetweenPools减小为1秒。我也将readCapacity和writeCapacity更新为10。但是同样的错误。

从AWS控制台中,我可以看到SpringIntegrationLockRegistry已超过读取阈值。

请帮助我们了解问题所在。

它有时会起作用,而有时会不起作用。

1 个答案:

答案 0 :(得分:0)

关于AWS上的DynamoDB,您可以执行以下操作:How to solve throughput error for dynamodb?

从应用程序的角度来看,您可以使用以下锁定选项:https://github.com/spring-cloud/spring-cloud-stream-binder-aws-kinesis/blob/master/spring-cloud-stream-binder-kinesis-docs/src/main/asciidoc/overview.adoc#lockregistry

  

leaseDuration

     

将授予锁的租约的时间长度。如果将其设置为例如30秒,则如果至少30秒未发送心跳(例如,如果框或心跳线程死亡,则会发生这种情况),锁定将失效。

     

默认值:20

     

heartbeatPeriod

     

更新DynamoDB的频率以注意到实例仍在运行(建议使该值至少比leaseDuration小3倍-例如,heartBeatPeriod = 1秒,leaseDuration = 10秒可能是一个合理的配置,请确保包括用于网络延迟的缓冲区。)

     

默认值:5

     

refreshPeriod

     

要再次尝试获取锁定之前要等待多长时间(例如,如果设置为10秒,它将每10秒尝试这样做一次)

     

默认值:1000