Spring Cloud Stream Kinesis Binder中getShardIterator频繁调用引发异常咨询
直接结论
使用2.2.0版本的Spring Cloud Stream Kinesis Binder消费Kinesis分片时,确实存在checkpoint前多次调用GetShardIterator的情况,这正是触发ProvisionedThroughputExceededException的原因。
原因说明
Kinesis消费的标准流程
按照AWS Kinesis团队的要求,正常消费流的逻辑是:首次读取分片时,调用
GetShardIterator获取初始迭代器;后续每次调用GetRecords后,应使用返回的NextShardIterator作为下一次GetRecords的参数,而非重复调用GetShardIterator。
AWS对GetShardIterator有严格限流:每个账户下的每个开放分片,每秒最多允许5次调用,超出就会抛出ProvisionedThroughputExceededException。Spring Cloud Stream Kinesis Binder 2.2.0的异常行为
该版本的Binder在处理checkpoint逻辑时,会显式调用KCL中的getShardIterator方法,没有严格遵循复用NextShardIterator的规范。当checkpoint操作较为频繁时,短时间内GetShardIterator的调用次数会突破AWS的限流阈值,从而触发异常。
现阶段建议
AWS Kinesis团队表示正在内部讨论针对此类异常的进一步指导方案,目前可以尝试调整checkpoint的触发频率(减少不必要的checkpoint操作),以此降低GetShardIterator的调用频次,缓解限流问题。
内容的提问来源于stack exchange,提问作者Keith Bennett

