Я столкнулся с проблемами потерянных записей, обновляя ряд в Кассандре. Вот моя схема:Утерянные обновления в 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 в локальной фактор репликации DC: 2 Cassandra Версия: 2.1.8
Я обновить значение столбца «баланса» каждый раз, когда пользователь выполняет транзакцию, считывая ранее установленное значение, добавляя сумму транзакции и выдавая обновление. Я использую Java, драйвер Datastax (2.1.5).
Однажды из примерно полумиллиона транзакций одно конкретное обновление потерпит неудачу. Обычно это происходит, когда пользователь совершил две транзакции в быстрой последовательности, вплоть до нескольких миллисекунд. Вот журналы:
Сделка # 1
10 фев 2016 18: 15: 16984 - [бассейн-11-токарно-1] - INFO - ScratchpadMasterStreamProcessor.processMessage (62) - Печать ул ID: 1466140282Scratchpad ID: 9127013322
10 февраля 2016 18: 15: 16986 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (43) - Текущий баланс: 0,0
10 февраля 2016 18: 15: 16986 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (44) - Отклонение: 200.0
10 февраля 2016 18: 15: 16986 - [бассейн -11-нить-1] - ОТЛАДКА - UserBalanceManager.updateWalletBalance (70) - Обновление user..510978682
10 февр 2016 18: 15: 16987 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater .updateBalance (51) - Итоговый баланс: 200.0
10 февраля 2016 18: 15: 16987 - [бассейн-11-поточно-1] - ОТЛАДКА - ScratchpadMasterStreamProcessor.processMessage (79) - Баланс обновления был успешным для бумажника 510978682
Сделка # 2
10 февраля 2016 18: 18: 19157 - [бассейн-11-поточно-1] - ИНФО - ConsumerThread .run (82) - Событие пОЛУЧАЛ
10 февраля 2016 18: 18: 19159 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (43) - Текущий баланс: 200.0
10 18 февраля 2016: 18: 19159 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (44) - Отклонение: 50,0
10 февраля 2016 18: 18: 19159 - [бассейн-11 -thread-1] - ОТЛАДКА - UserBalanceManager.updateWalletBalance (70) - Обновление user..510978682
10 февр 2016 18: 18: 19160 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (51) - Итоговый баланс: 250.0
10 февраля 2016 18: 18: 19160 - [бассейн-11-поточно-1] - ОТЛАДКА - ScratchpadMasterStreamProcessor.processMessage (79) - Баланс обновления был успешным для бумажник 510978682
сделка # 3 (Это потеряно)
10 февраля 2016 18: 18: 19160 - [бассейн-11-токарно-1] - INFO - ScratchpadMasterStreamProcessor.processMessage (62) - Печать ул идентификатор : 1466162182Scratchpad id: 9127117934
10 февраля 2016 18: 18: 19161 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (43) - Текущий баланс: 250.0
10 февраля 2016 18: 18: 19161 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (44) - Отклонение: -250,0
10 февраля 2016 18: 18: 19161 - [бассейн-11-поточно-1] - DEBUG - UserBalanceManager.updateWalletBalance (70) - Обновление пользователя..510978682
10 февраля 2016 18: 18: 19162 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (51) - Итоговый баланс: 0,0
10 февраля 2016 18: 18: 19162 - [бассейн -11-нить-1] - ОТЛАДКА - ScratchpadMasterStreamProcessor.processMessage (79) - Баланс обновление была успешной для бумажника 510978682
сделки #-чтения затхлого баланса, ой
10 февраля 2016 18: 18: 23140 - [pool-11-thread-1] - INFO - ConsumerThread.run (82) - Полученное событие
10 февраля 2016 18: 18: 23140 - [бассейн-11-поточно-1] - ИНФО - ScratchpadMasterStreamProcessor.processMessage (62) - Печать ул ID: 1466162730Scratchpad ID: 9127120830
10 февраля 2016 18: 18: 23141 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (43) - Текущий баланс: 250.0
10 февраля 2016 18: 18: 23141 - [бассейн-11-резьбовых 1] - DEBUG - SclwBalanceUpdater.updateBalance (44) - Отклонение: 200,0
10 февраля 2016 18: 18: 23141 - [бассейн-11-поточно-1] - ОТЛАДКА - UserBalanceManager.updateWalletBalance (70) - Обновление user..510978682
10 февраля 2016 18: 18: 23,142 - [бассейн-11-поточно-1] - ОТЛАДКА - SclwBalanceUpdater.updateBalance (51) - Итоговый баланс: 450.0
10 февраля 2016 18: 18: 23142 - [бассейн-11-поточно-1] - ОТЛАДКА - ScratchpadMasterStreamProcessor.ProcessMessage (79) - Баланс обновление было успешным для бумажника 510978682
Я установил уровень согласованности в LOCAL_QUORUM как для чтения и записи, а также три сервера Cassandra узла имеет одинаковое время (с помощью NTP). В чем может быть проблема?
База данных, такая как Cassandra, имеет значительные преимущества, когда речь заходит о расширении, распределении по нескольким центрам обработки данных и доступности. Но это связано с ценой сокращения гарантий последовательности. И это, скорее всего, то, что вы испытываете. Я не уверен, что Кассандра является правильным выбором, если баланс должен быть точным при любых обстоятельствах. – Codo