每天向 Kinesis 流式传输数十亿条消息。
我们正在寻找一种实现方式,使我们能够以完全一次保证的方式向 Kinesis 传递消息。
我们的生产者框架要求流接收器是幂等的,以保证一次性交付,而 Kinesis 不是。因此,我们目前至少收到一次交货。(重复是可能的,我们确实看到了它们,当流式微批处理由于生产者端的任何原因必须重新启动时)
我们开始研究 Kinesis Producer Library (KPL)回调函数。基本上,我们将根据每条消息中存在的密钥跟踪 DynamoDB 中已传递的消息和未传递的消息的状态。如果我们知道已经发送了一条消息,我们将跳过它以重新尝试传递。然后似乎完全一次是可能的..有两个问题:
1) 我们唯一的问题——我们失去回调函数调用的可能性有多大(例如网络故障等),或者回调函数本身失败了(例如我们遇到了 DynamoDB 限制/中断等)——是这记录在某处?我知道机会并不高,但我们想设计一个系统,能够对这些预期的事情有弹性。
2)时间。假设 Kinesis 出于某种原因延迟调用了回调函数(5-15 毫秒就足以打破上述回调函数中的一些假设,这些假设在 DynamoDB 中保持交付状态)。虽然我们还没有收到关于交付的确认,但我们的流媒体制作者框架已经尝试重新交付它认为尚未交付。这个潜在问题的任何解决方法?
附言。我们知道一种解决方法是在应用程序端(来自该 kinesis 流的接收器)进行重复数据删除,但这不在我们的项目范围内,我们很难要求恰好一次进入该 Kinesis 流。