我们有一个非常简单的spring-cloud-stream应用程序,可以从AWS-Kinesis队列中读取。它已经工作了一段时间没有问题。它只有很少的工作量。
今天,我们每秒收到超过100个例外。 (这比我们在此应用程序上拥有的用户还要多,因此它看起来像是一个无休止的重试循环)
WARN --- [s-shard-locks-1] c.a.s.d.AmazonDynamoDBLockClient :
Could not acquire lock because of a client side failure in talking to DDB
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
...
at org.springframework.integration.aws.lock.DynamoDbLockRegistry$DynamoDbLock.doLock(DynamoDbLockRegistry.java:504)
代码很简单:
@StreamListener(Channels.OUR_CHANNEL)
fun consumeThing(Thing: MutableMap<Any, Any>) {
log.info("thing received: {}.", thing)
// some methods to write it to our own datbase
}
我们只有一个基本配置:
spring:
cloud:
stream:
defaultBinder: kinesis
bindings:
thingsChannel:
group: aGroup
destination: aDestionation
在AWS-Console中,我们看到一条警告,指出在DynamoBD中,SpringIntegrationLockRegistry超出了读取容量。我们把它从1改为10,但是仍然有问题。
如何配置spring-data-cloud和kinesis使其更具弹性,并且在没有等待时间的情况下不要重试?
答案 0 :(得分:1)
请查看LockRegistry
的可能选项: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
似乎AWS控制台中表上的策略已更改。您可能需要重新考虑该表或我提到的客户端的某些超时和读写能力。
您可能会进一步了解有关DynamoDB Lock Client here的更多信息,该内容已不受Spring Cloud Stream控制。顺便说一句,这是项目的名称,而不是data
...