Scylla(Cassandra)的一致性问题

c9qzyr3d  于 8个月前  发布在  Cassandra
关注(0)|答案(1)|浏览(98)

请帮助我解决以下问题:
有一个Scylla集群(5个节点)。Kafka消息在应用程序中处理。Scylla通过复合分区键(externalId,systemId)存储实体。当处理Kafka消息时,Scylla存储实体处理数据,处理后实体进入另一个微服务的下一个处理阶段。
处理后,将收到此实体的通知。在此阶段,出现浮动问题:从锡拉接收到一个带有过时数据的实体

我们尝试做的是:

  • 作为轻量级事务执行的请求(1)
  • 在scylla驱动中写入consistency_level = ALL(使用spring-boot-starter-data-cassandra)。这些措施并没有解决问题。
bcs8qyzn

bcs8qyzn1#

在ScyllaDB(和Cassandra)一致性模型中,您分别控制写和读的一致性级别。如果您想确保在更新完成后,选择将读取更新的数据,您需要选择允许这种情况的写入和读取一致性级别的某些组合。例如,使用QUORUM写入(当RF=3时,这意味着3个中的2个),然后再次使用QUORUM阅读,确保读取至少到达一个最新节点,因此您读取最新数据。
也就是说,使用一致性级别ALL(您说您尝试过)进行写入也应该足够了,无论使用哪个一致性级别进行读取:在CL=ALL写操作中,写操作会等待,直到每个副本都成功更新。此时,对任何节点的读取都将返回更新后的数据-没有任何节点需要返回过时的数据!因此,如果CL=ALL对您不起作用,我猜是您的应用程序中有什么地方出错了。例如,可能发生以下情况之一:
1.您以为在应用程序代码中对写操作设置了CL=ALL,但它没有任何效果。
1.有些写操作失败,而您没有注意到。CL=ALL写失败并不能保证它写的内容的一致性。

相关问题