Я сталкиваюсь с проблемами потерянных записей при обновлении строки в Cassandra. Вот моя схема:
create table balances(
id bigint,
balance decimal,
last_transaction_id bigint,
update_timestamp timestamp,
type varchar,
is_balance_valid boolean,
primary key (wallet_id)
)
Всего узлов в кластере: 3 в локальном контроллере домена Коэффициент репликации: 2 Версия Cassandra: 2.1.8
Я обновляю значение столбца «баланс» каждый раз, когда пользователь выполняет транзакцию, читая ранее установленное значение, добавляя сумму транзакции и выдавая обновление. Я использую Java, драйвер Datastax (2.1.5).
Однажды из примерно полумиллиона транзакций одно конкретное обновление давало сбой. Обычно это происходит, когда пользователь выполнил две транзакции в быстрой последовательности, вплоть до нескольких миллисекунд. Вот журналы:
Сделка №1
10 февраля 2016 г. 18:15:16,984 -[pool-11-thread-1]- INFO – ScratchpadMasterStreamProcessor.processMessage(62) – Идентификатор строки печати: 1466140282Идентификатор блокнота: 9127013322
10 февраля 2016 г. 18:15:16,986 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(43) - Текущий баланс: 0,0
10 февраля 2016 г., 18:15:16,986 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(44) - Отклонение: 200,0
10 февраля 2016 г. 18:15:16,986 -[pool-11-thread-1]- DEBUG - UserBalanceManager.updateWalletBalance(70) - Обновление пользователя..510978682
10 февраля 2016 г. 18:15:16,987 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(51) - Окончательный баланс: 200,0
10 февраля 2016 г., 18:15:16,987 -[pool-11-thread-1]- DEBUG - ScratchpadMasterStreamProcessor.processMessage(79) - Обновление баланса для кошелька 510978682 выполнено успешно
Сделка №2
10 февраля 2016 г., 18:18:19,157 -[pool-11-thread-1]- INFO – ConsumerThread.run(82) – Событие получено
10 февраля 2016 г. 18:18:19,159 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(43) - Текущий баланс: 200,0
10 февраля 2016 г. 18:18:19,159 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(44) - Отклонение: 50,0
10 февраля 2016 г. 18:18:19,159 -[pool-11-thread-1]- DEBUG - UserBalanceManager.updateWalletBalance(70) - Обновление пользователя..510978682
10 февраля 2016 г. 18:18:19,160 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(51) - Окончательный баланс: 250,0
10 февраля 2016 г. 18:18:19,160 -[pool-11-thread-1]- DEBUG - ScratchpadMasterStreamProcessor.processMessage(79) - Обновление баланса для кошелька 510978682 выполнено успешно
Транзакция №3 (утеряна)
10 февраля 2016 г. 18:18:19,160 -[pool-11-thread-1]- INFO – ScratchpadMasterStreamProcessor.processMessage(62) – Идентификатор строки печати: 1466162182Идентификатор блокнота: 9127117934
10 февраля 2016 г. 18:18:19,161 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(43) - Текущий баланс: 250,0
10 февраля 2016 г. 18:18:19,161 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(44) - Отклонение: -250,0
10 февраля 2016 г. 18:18:19,161 -[pool-11-thread-1]- DEBUG - UserBalanceManager.updateWalletBalance(70) - Обновление пользователя..510978682
10 февраля 2016 г. 18:18:19,162 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(51) - Окончательный баланс: 0,0
10 февраля 2016 г. 18:18:19,162 -[pool-11-thread-1]- DEBUG - ScratchpadMasterStreamProcessor.processMessage(79) - Обновление баланса для кошелька 510978682 выполнено успешно
Транзакция #4 Прочитал просроченный баланс, упс
10 февраля 2016 г., 18:18:23,140 -[pool-11-thread-1]- INFO – ConsumerThread.run(82) – Событие получено
10 февраля 2016 г. 18:18:23,140 -[pool-11-thread-1]- INFO – ScratchpadMasterStreamProcessor.processMessage(62) – Идентификатор строки печати: 1466162730Идентификатор блокнота: 9127120830
10 февраля 2016 г. 18:18:23,141 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(43) - Текущий баланс: 250,0
10 февраля 2016 г. 18:18:23,141 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(44) - Отклонение: 200,0
10 февраля 2016 г. 18:18:23,141 -[pool-11-thread-1]- DEBUG - UserBalanceManager.updateWalletBalance(70) - Обновление пользователя..510978682
10 февраля 2016 г. 18:18:23,142 -[pool-11-thread-1]- DEBUG - SclwBalanceUpdater.updateBalance(51) - Окончательный баланс: 450,0
10 февраля 2016 г. 18:18:23,142 -[pool-11-thread-1]- DEBUG - ScratchpadMasterStreamProcessor.processMessage(79) - Обновление баланса для кошелька 510978682 выполнено успешно
Я установил уровень согласованности LOCAL_QUORUM как для чтения, так и для записи, и три сервера узлов cassandra имеют одинаковое время (с использованием NTP). В чем может быть проблема?