我正在使用批处理模式从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已超过读取阈值。
请帮助我们了解问题所在。
它有时会起作用,而有时会不起作用。
答案 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