1

我在考虑使用Kafka连接将来自Cassandra的更新流传输到Kafka主题。来自StreamReactor的现有连接器似乎使用时间戳或uuidtimestamp来提取自上次轮询以来的新更改。时间戳的值在插入语句中使用now()插入。连接器然后保存上次收到的最大时间。cassandra kafka连接源和最终一致性

由于Cassandra最终是一致的,我想知道在使用时间范围进行重复查询以获得新更改时实际发生了什么。是否有风险错过插入到Cassandra中的行,因为在使用WHERE create> = maxTimeFoundSoFar时,它会“延迟到”查询的节点?

回答

1

是的,它可能发生,你有新的数据在你的“光标”面前的时候,你已经去与处理,如果您使用的一致性水平一个用于读取和写入,但即使你使用更高的一致性,你可能会遇到“问题”取决于你的设置。基本上有很多事情可能会出错。

您可以通过使用旧的卡桑德拉式NUM_NODES_RESPONDING_TO_READ + NUM_NODES_RESPONDING_TO_WRITE > REPLICATION_FACTOR增加不这样做的机会,但因为使用的是now()从卡桑德拉节点时钟可能有他们之间的毫秒偏移量,所以你甚至可能会错过的数据,如果你有高频率数据。我知道一些系统,人们实际上使用gps模块的树莓派来保持时钟偏斜非常紧密:)

你将不得不提供更多关于你的用例,但事实上是的,你可以完全跳过一些插入,如果你并不是“谨慎”的,但即使如此,也没有100%的保证,除非您处理数据的数据有足够的偏移量,足以让新数据进入并解决。

基本上你就必须保持在过去的一些移动时间窗口,然后沿再加确保你不考虑什么比让我们说最后一分钟更新的移动。这样你就可以确保数据“稳定”。

我不得不在这里我们处理,将排在与延迟多天感觉数据的一些使用情况。在某些项目中,我们忽略了一些数据用于报告月份的数据,因此我们总是处理旧数据并将其添加到报告数据库。即我们在历史3天前保持了一个时间窗口。

这只是取决于你的使用情况。

+1

感谢您的回答。所以我的假设并不完全错误。我想从卡桑德拉发布的数据卡夫卡的数据推给其他消费者的“实时”的。我不想丢失数据,所以我的方法可能不理想 – KTrum