我正在考虑使用Kafka连接流从Cassandra到Kafka主题的更新。streamreactor的现有连接器似乎使用时间戳或uuidtimestamp来提取自上次轮询以来的新更改。在insert语句中使用now()插入时间戳的值。然后,连接器保存上次接收的最长时间。
由于cassandra最终是一致的,我想知道当使用一个时间范围进行重复查询以获得新的更改时,实际会发生什么。在使用where create>=maxtimefoundsofar时,是否存在由于cassandra“迟到”到查询节点而错过插入到cassandra中的行的风险?
1条答案
按热度按时间mu0hgdu01#
是的,如果您正在使用一致性级别1进行读写,那么当您已经开始处理时,您的“光标”前面可能有较新的数据,但是即使您使用较高的一致性,根据您的设置,您也可能会遇到“问题”。基本上有很多事情会出错。
你可以通过使用一个旧的Cassandra公式来增加不这样做的机会
NUM_NODES_RESPONDING_TO_READ + NUM_NODES_RESPONDING_TO_WRITE > REPLICATION_FACTOR
但既然你用的是now()
从cassandra来看,节点时钟之间可能有毫秒偏移,因此如果有高频数据,甚至可能会丢失数据。我知道一些系统,人们实际上是使用树莓皮的gps模块,以保持时钟倾斜非常严格:)您必须提供更多关于您的用例的信息,但实际上是的,如果您不“小心”,您完全可以跳过一些插入,但即使这样也没有100%的保证,否则您将使用一些偏移量处理数据,这些偏移量足以让新数据进入并解决。
基本上,你必须在过去保持一些移动的时间窗口,然后移动它,再加上确保你不考虑任何比我们说的最后一分钟更新的东西。这样你就可以确保数据“稳定”了。
我有一些用例,我们处理的感官数据会延迟好几天。在一些项目中,我们只是忽略了它,在一些项目中,数据是用于每月报告的,所以我们总是处理旧数据并将其添加到报告数据库中。i、 我们在历史上保留了三天的时间窗口。
这取决于你的用例。