Почему изменение статуса страницы в базе данных Cassandra не всегда работает?

У меня довольно сложное веб-приложение, которое создает HTML-страницы в базе данных Cassandra.

При создании страницы она сохраняет на этой странице статус, отражающий тот факт, что над ней работают.

INSERT INTO content (key,                  column1,          value)
VALUES ('http://domain/path', 'content:status', 0x0201);

(Названия столбцов взяты из экономных дней …)

Пока статус 0x0201, ни один другой процесс не может ничего сделать со страницей. Это рассматривается как запертый.

Закончив создание страницы, примерно за одну мс, я переключаю статус в «нормальный». Это еще одна вставка из content::status поле.

INSERT INTO content (key,                  column1,          value)
VALUES ('http://domain/path', 'content:status', 0x0102);

Здесь статус меняется с 0x0201 в 0x0102, Только из примерно 700 страниц, которые я создаю при инициализации веб-сайта, этот статус не изменяется для 22-30 из них (от 3% до 4%).

Может ли это произойти, потому что время между первым INSERT INTO а второй слишком короткий и кластер Кассандры запутался? (т. е. видит, что оба прибывают вместе, и выбирает один из них, просто он оказывается неправильным в тех немногих случаях, когда он терпит неудачу?)

0

Решение

При использовании драйвера C ++ (и других, я уверен) две команды INSERT могут быть отправлены в два разных конвейера. Это связано с тем, что драйвер обрабатывает рабочие потоки, а команды могут оказаться в одном из конвейеров рабочих потоков.

Это означает, что даже если вы отправляете CREATE, а затем NORMAL, конвейеры потоков могут закончить тем, что сначала отправят NORMAL, а затем CREATE в Cassandra (т. Е. Поменяют порядок, в котором данные были сначала отправлены в драйвер C ++.) Затем вы получите статус СОЗДАТЬ …

Это не может быть решено напрямую. Вместо этого вы можете захотеть использовать блокировку при выполнении работы на этой странице, после завершения работы также измените статус на НОРМАЛЬНЫЙ, если это было что-то другое, затем разблокируйте. Если у вас есть блокировка с тайм-аутом, то вы никогда не должны создавать полную тупиковую ситуацию (то есть одну страницу обработки процесса A, затем B, не снимая блокировки на странице A перед работой на B, и другой процесс, сначала обрабатывающий страницу B, а затем A … )

0

Другие решения

Других решений пока нет …