cassandra - Cassandra 并不暗示执行语句的特定顺序
问题描述
Cassandra 并不暗示执行语句的特定顺序。
执行如下代码的语句不会按顺序执行。
INSERT INTO channel
JSON ''{"cuid":"NQAA0WAL6drA"
,"owner":"123"
,"status":"open"
,"post_count":0
,"mem_count":1
,"link":"FWsA609l2Og1AADRYODkzNjE2MTIyOTE="
, "create_at":"1543328307953"}}'';
BEGIN BATCH
UPDATE channel
SET title = ? , description = ? WHERE cuid = ? ;
INSERT INTO channel_subscriber
JSON ''{"cuid":"NQAA0WAL6drA"
,"user_id":"123"
,"status":"subscribed"
,"priority":"owner"
,"mute":false
,"setting":{"create_at":"1543328307956"}}'';
APPLY BATCH ;
根据 system_traces.sessions,它们中的每一个都由不同的节点接收。
有时started_at
两个查询的时间相等(以毫秒为单位),有时started_at
第二个查询的时间小于第一个。因此,这破坏了语句和数据的顺序。
我们使用 erlang,marina 驱动,consistency_level 是 QUORUM,所有 cassandra 节点和应用服务器的时间是同步的。
如何强制 Cassandra 按顺序执行查询?
解决方案
由于分布式特性,Cassandra 中的查询可以由不同的节点接收,并且根据特定节点上的负载,可能是一些稍后发送的查询被更早地执行。在您的情况下,您可以将第一个插入放入批次本身。或者,因为它在某些驱动程序(例如,Java 驱动程序)中实现,所以使用白名单策略将查询仅发送到一个节点 - 但在这种情况下它将成为瓶颈。(而且我真的不确定您的驱动程序是否具有这样的功能)。
推荐阅读
- groovy - 将运行时提示从 PBCS Groovy 业务规则传递到调用的业务规则的参数(非 Groovy)
- coldfusion - 如何在导出到 Excel 之前更改 cfquery 结果的值?
- html - 如何在调整浏览器窗口大小时制作不制动和水平滚动的 HTML 页面
- php - Laravel 6.4:__toString() 必须返回一个字符串值
- ios - 如何将标签/属性添加到 XCUITest(Swift)
- java - Java中Wallis函数的递归实现
- javascript - Javascript:子/子对象应该使用由其父对象实例化的依赖项,还是应该实例化自己的依赖项实例?
- javascript - 使用 sequelize findAll 时,forEach 找不到正确的用户 ID
- php - PHP DateTime 在 WHILE 循环期间写出值
- c - 在 C 中打印二维手机键盘中的每个解锁图案