首页 > 解决方案 > 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 按顺序执行查询?

标签: cassandratimestamperlang

解决方案


由于分布式特性,Cassandra 中的查询可以由不同的节点接收,并且根据特定节点上的负载,可能是一些稍后发送的查询被更早地执行。在您的情况下,您可以将第一个插入放入批次本身。或者,因为它在某些驱动程序(例如,Java 驱动程序)中实现,所以使用白名单策略将查询仅发送到一个节点 - 但在这种情况下它将成为瓶颈。(而且我真的不确定您的驱动程序是否具有这样的功能)。


推荐阅读