Kinesis Producer 回调函数 - 保证交付?
Kinesis Producer callback functions - guaranteed delivery?
每天向 Kinesis 传输数十亿条消息。
我们正在寻找一种允许我们使用 exactly-once gua运行tee 将消息传送到 Kinesis 的实现。
我们的生产者框架要求流式接收器是幂等的,以实现恰好一次交付 gua运行tee,而 Kinesis 不是。因此,我们目前 至少一次 交付。 (重复是可能的,我们确实看到了它们,当生产者端出于任何原因必须重新启动流式微批处理时)
我们开始研究 Kinesis Producer Library (KPL) 回调函数。基本上,我们将根据每条消息中存在的键来跟踪 DynamoDB 中哪些消息已传递以及哪些未传递的状态。如果我们知道消息已经发送,我们将跳过它以重新尝试发送。然后似乎 exactly-once 是可能的..有两个问题:
1)
我们唯一的问题 - 我们失去回调函数调用的可能性有多大(例如网络故障等),或者回调函数本身失败(例如我们 运行 进入 DynamoDB 限制/中断等) - - 这是否记录在某处?我知道机会不高,但我们想设计一个系统,能够对这些预期的事情有弹性。
2)
定时。假设 Kinesis 是否出于某种原因调用了延迟的回调函数(5-15 毫秒足以打破上述回调函数中的一些假设,这些假设在 DynamoDB 中保持交付状态)。虽然我们还没有收到关于交付的确认,但我们的流媒体制作者框架已经尝试重新交付它认为尚未交付的内容。这个潜在问题的任何解决方法?
ps。我们知道一种解决方法是在应用程序端(来自该运动流的接收器)制作 dedups ,但这不在我们的项目范围内,我们有一个严格的要求,即一次进入该运动流.
对于第 1 点,无论你走什么路,你都会发现自己处于极端情况下,这可能会导致你丢失数据或重复调用。如果消费者不参与该协议,即使使用 two phased commit protocol 在这里也不起作用。
对于 #2,Kinesis 是有序的,所以如果你确实得到重复项,你应该能够可靠地假设它们将在同一个分片上,因此在另一个 reader 仍在处理时不被处理(假设每个分片一个 reader)。只需确保在调用 DynamoDB 时使用 strongly consistent read。
每天向 Kinesis 传输数十亿条消息。
我们正在寻找一种允许我们使用 exactly-once gua运行tee 将消息传送到 Kinesis 的实现。
我们的生产者框架要求流式接收器是幂等的,以实现恰好一次交付 gua运行tee,而 Kinesis 不是。因此,我们目前 至少一次 交付。 (重复是可能的,我们确实看到了它们,当生产者端出于任何原因必须重新启动流式微批处理时)
我们开始研究 Kinesis Producer Library (KPL) 回调函数。基本上,我们将根据每条消息中存在的键来跟踪 DynamoDB 中哪些消息已传递以及哪些未传递的状态。如果我们知道消息已经发送,我们将跳过它以重新尝试发送。然后似乎 exactly-once 是可能的..有两个问题:
1) 我们唯一的问题 - 我们失去回调函数调用的可能性有多大(例如网络故障等),或者回调函数本身失败(例如我们 运行 进入 DynamoDB 限制/中断等) - - 这是否记录在某处?我知道机会不高,但我们想设计一个系统,能够对这些预期的事情有弹性。
2) 定时。假设 Kinesis 是否出于某种原因调用了延迟的回调函数(5-15 毫秒足以打破上述回调函数中的一些假设,这些假设在 DynamoDB 中保持交付状态)。虽然我们还没有收到关于交付的确认,但我们的流媒体制作者框架已经尝试重新交付它认为尚未交付的内容。这个潜在问题的任何解决方法?
ps。我们知道一种解决方法是在应用程序端(来自该运动流的接收器)制作 dedups ,但这不在我们的项目范围内,我们有一个严格的要求,即一次进入该运动流.
对于第 1 点,无论你走什么路,你都会发现自己处于极端情况下,这可能会导致你丢失数据或重复调用。如果消费者不参与该协议,即使使用 two phased commit protocol 在这里也不起作用。
对于 #2,Kinesis 是有序的,所以如果你确实得到重复项,你应该能够可靠地假设它们将在同一个分片上,因此在另一个 reader 仍在处理时不被处理(假设每个分片一个 reader)。只需确保在调用 DynamoDB 时使用 strongly consistent read。