У нас есть довольно простое приложение 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, но все еще есть проблема.
Как настроить весеннее облако данных и kinesis так, чтобы оно было более устойчивым, и не повторять его без некоторого времени ожидания?