Консистенция Кассандры с использованием пользовательской блокировки - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть требование вести таблицу инвентаризации (inventory_table) в cassandra, в которой будет два элемента столбца и уровень запасов, которые будут обновляться очень часто и параллельно, так как клиенты покупают элементы в Интернете, так что может случиться так, что между моим выбором и обновлением в моем приложении какой-то другой поток / процесс обновил те же данные, чтобы избежать этого несоответствия, я создал другую таблицу

CREATE TABLE LOCKED_items
(
LOCKED text,
item text,
lock_date timestamp,
PRIMARY KEY ((LOCKED),item)
);

в этой таблице ключ раздела ЗАБЛОКИРОВАН, а ключ кластеризации - элемент, поэтому все блокировки (строки) будут присутствовать в одном разделе.

до того, как моя транзакция начнется, я буду использовать легковесную транзакцию для вставки строки в таблицы locked_items, если вставка будет успешной, тогда только я буду работать дальше, иначе повторю попытку вставки, чтобы сделать бизнес-логику приложения изолированной и атомарной

insert into locked_item  (LOCKED,item,lock_date) values('Y','item1',toTimestamp(now())) IF NOT EXISTS;

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

BEGIN BATCH
insert into locked_skus (LOCKED,sku,lock_date) values('Y','item5',toTimestamp(now())) IF NOT EXISTS;
insert into locked_skus (LOCKED,sku,lock_date) values('Y','item6',toTimestamp(now())) IF NOT EXISTS;
insert into locked_skus (LOCKED,sku,lock_date) values('Y','tem7',toTimestamp(now())) IF NOT EXISTS;
insert into locked_skus (LOCKED,sku,lock_date) values('Y','tem61',toTimestamp(now())) IF NOT EXISTS;
APPLY BATCH;

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

Мой вопрос: как это будет влиять на производительность этого механизма блокировки с точки зрения Кассандры? Стоит ли это того, моё ограничение - использовать Кассандру только в качестве БД, поскольку это требование клиента. Есть ли способ лучше ? Edit

...