Кассандра не подразумевает особый порядок, в котором выполняются заявления - PullRequest
0 голосов
/ 04 декабря 2018

Кассандра не подразумевает особый порядок, в котором выполняются операторы.

Выполнение операторов, подобных приведенному ниже, не выполняется в этом порядке.

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.сеансы, каждый из которых принимается разными узлами.

Иногда время started_at в обоих запросах равно (в миллисекундах), иногда время started_at второго запроса меньше первого.Таким образом, это разрушает порядок операторов и данных.

Мы используем erlang, marina driver, consistency_level равен QUORUM, а время всех узлов и серверов приложений cassandra синхронизировано.

Как заставить Cassandra принудительно работать?выполнять запросы по порядку?

1 Ответ

0 голосов
/ 04 декабря 2018

Из-за распределенной природы запросы в Cassandra могут приниматься разными узлами, и в зависимости от нагрузки на конкретный узел может случиться так, что некоторые запросы, отправленные позже, будут выполнены раньше.В вашем случае вы можете поместить первую вставку в саму партию.Или, как это реализовано в некоторых драйверах (например, драйвер Java ), используйте политику белых списков для отправки запросов только одному узлу, но в этом случае это будет узким местом.(и я действительно не уверен, что ваш драйвер имеет такую ​​функциональность).

...