Распределенная блокировка на уровне строк в таблице Cassandra ИЛИ Обеспечение более высокой согласованности - PullRequest
0 голосов
/ 07 сентября 2018

Мы используем Cassandra DB в нашем микро-сервисном проекте. В производстве эта услуга развернута в PCF, которую можно масштабировать до 6 экземпляров. У нас есть таблица (TableA) со столбцом (materialSet) в виде замороженного набора. В одном из функционалов параллельные потоки выполняют нижеуказанный функционал (метод синхронизирован) -

  1. Прочитайте таблицу A, чтобы получить материалSet
  2. Добавить / удалить материалы, поступающие из запроса в / из набора материалов
  3. Написать окончательный материал. Установить в таблицу A

С одним экземпляром в более низкой среде обслуживания он работает нормально. Но в производстве, когда обслуживание масштабируется до нескольких экземпляров, результаты в таблице становятся противоречивыми. Причина синхронизации будет работать в той же JVM, но когда служба масштабируется, другие экземпляры работают в другой JVM, и чтение / запись происходят независимо. Есть ли способ решить эту проблему? Я, вероятно, знаю, что это неверная модель данных, которой мы следуем, которая ведет нас к этой проблеме, но мы не можем это изменить.

Есть ли какие-либо способы использования распределенной блокировки на уровне строк в таблице Кассандры ИЛИ как можно добиться более высокой согласованности?

1 Ответ

0 голосов
/ 07 сентября 2018

Посмотрите на этот пример у Патрика Каллагана, который использует LWT для обеспечения кросс-поточной + кросс-процессной сериализации в сценарии управления запасами:

https://github.com/PatrickCallaghan/datastax-transaction-demo

В частности, вас может заинтересовать запрос, в котором используется ключевое слово IF:

UPDATE " + tableNameProduct + " SET orderIds=orderIds + {'" + order.getOrderId() + "'},"
            + " capacityleft = " + (lastCapacity-1) + " WHERE productId = '" + order.getProductId() + "' IF capacityleft = " + lastCapacity;

https://github.com/PatrickCallaghan/datastax-transaction-demo/blob/master/src/main/java/com/datastax/transactions/dao/OrderDao.java#L64-L65

...