Как выполнить пакетный оператор и LWT как транзакцию в Кассандре - PullRequest
0 голосов
/ 16 мая 2018

У меня есть две таблицы с моделью ниже:

CREATE TABLE IF NOT EXISTS INV (
  CODE TEXT,
  PRODUCT_CODE TEXT,
  LOCATION_NUMBER TEXT,
  QUANTITY DECIMAL,
  CHECK_INDICATOR BOOLEAN,
  VERSION BIGINT,
PRIMARY KEY ((LOCATION_NUMBER, PRODUCT_CODE)));

CREATE TABLE IF NOT EXISTS LOOK_INV (
  LOCATION_NUMBER TEXT,
  CHECK_INDICATOR BOOLEAN,
  PRODUCT_CODE TEXT,
  CHECK_INDICATOR_DDTM TIMESTAMP,
PRIMARY KEY ((LOCATION_NUMBER), CHECK_INDICATOR, PRODUCT_CODE))
WITH CLUSTERING ORDER BY (CHECK_INDICATOR ASC, PRODUCT_CODE ASC);

У меня есть бизнес-операция, в которой мне нужно обновить CHECK_INDICATOR как в таблицах, так и в QUANTITY в таблице INV. Так как CHECK_INDICATOR является частью ключа в таблице LOOK_INV, мне нужно сначала удалить строку и вставить новую строку. Ниже приведены три операции, которые мне нужно выполнить в пакетном режиме (либо все они будут выполнены успешно, либо ни одна из них не должна быть выполнена)

  1. Удалить строку из таблицы LOOK_INV.
  2. Вставить строку в таблицу LOOK_INV.
  3. Обновить QUANTITY и CHECK_INDICATOR в таблице INV.

Поскольку к таблице INV получают доступ несколько потоков, перед обновлением строки таблицы INV необходимо убедиться, что она не изменялась с момента последнего чтения. Я использую транзакцию LWT для обновления таблицы INV, используя столбец и пакетную операцию VERSON для удаления и вставки в таблицу LOOK_INV. Я хочу добавить все три операции в пакетном режиме. Но, поскольку LWT неприемлемо в пакетном режиме, мне нужно выполнить вышеуказанным способом.

Проблема с этим подходом состоит в том, что в некоторых сценариях пакетное выполнение выполняется успешно, но обновление таблицы INV приводит к исключению тайм-аута, и данные становятся инклюзивными в обеих таблицах.

Есть ли какие-либо функции, предоставляемые Кассандрой для элегантной обработки сценариев такого типа?

1 Ответ

0 голосов
/ 19 мая 2018

Осторожно с легкими транзакциями (LWT)

Легкие транзакции в настоящее время считаются анти-паттерном Cassandra из-за проблем с производительностью, с которыми вы страдаете.

Вотнемного контекста для объяснения.

Cassandra не использует транзакции RIDBMS ACID с механизмами отката или блокировки.Он не обеспечивает блокировку из-за фундаментального ограничения на все виды распределенного хранилища данных, которое называется CAP Теорема .В нем говорится, что распределенная компьютерная система не может одновременно предоставить все три из следующих гарантий:

  • Согласованность (все узлы видят одни и те же данные одновременно)
  • Доступность(гарантия того, что на каждый запрос получен ответ о том, был ли он успешным или неудачным)
  • Допуск раздела (система продолжает работать, несмотря на произвольную потерю сообщения или отказ части системы)

enter image description here

Из-за этого Cassandra не подходит для атомарных операций, и вам не следует использовать Cassandra для этой цели.

Он обеспечивает легкие транзакции,который может заменить блокировку в некоторых случаях.Но поскольку протокол Paxos (основа для LWT) включает в себя ряд действий, которые происходят между узлами, между узлом, который предлагает LWT, и другими репликами, являющимися частью транзакции, будет несколько циклов.

Это отрицательно влияет на производительность и является одной из причин ошибки WriteTimeoutException.В этой ситуации вы не можете знать, была ли применена операция LWT, поэтому вам нужно повторить ее, чтобы вернуться к стабильному состоянию.Поскольку LWT стоят слишком дорого, драйвер не будет автоматически повторять его для вас.

LTW имеет большие потери производительности, если его часто используют, и мы видим, что у некоторых клиентов возникают проблемы с большим временем ожидания из-за использования LWT.

Легкие транзакции, как правило, являются плохой идеей и должны использоваться нечасто.

Если вам требуются свойства ACID для части вашей рабочей нагрузки, но вам все же требуется масштабировать ее, рассмотрите возможность смещения этой части вашей нагрузки на cochroach BD .Таким образом, если вам нужны транзакции ACID, как правило, гораздо проще внедрить вторую технологию.

...