Должны ли мы использовать счетчик Cassandra NoSQL или LWT для автоматической генерации целочисленных ключей?
Мы хотим сгенерировать автоматический инкрементальный ключ в Cassandra. Это простая задача в традиционных базах данных, но немного сложная в Кассандре.
Я опробовал тип данных счетчика, который может быть увеличен с помощью
value=value+1
и попробовал LWT с
UPDATE myTable SET value=newValue IF value=oldValue.
(where newValue=oldValue+1 for auto increment)
Я был настоятельно предупрежден против встречных переменных. Я не уверен, почему, хотя. Можете ли вы помочь мне понять плюсы и минусы вышеупомянутых двух подходов?
1 ответ
Начиная с заявления об отказе, вы, скорее всего, не хотите автоинкрементный целочисленный ключ в C*. Скорее всего, вам нужен UUID или TimeUUID. Но если вам действительно нужно автоматически увеличивать значение, читайте дальше.
Государственные и распределенные системы не любят смешиваться. Обычно, когда вы хотите "действительно" убедиться в состоянии вашей распределенной системы, вы должны проверять все реплики и, таким образом, жертвовать доступностью / допуском раздела. LWT использует Paxos, чтобы разрешить операции проверки и установки, но для этого им требуется кворум узлов и они значительно медленнее, чем обычные операции Cassandra. LWT следует использовать только в небольшом проценте операций, используемых в ваших приложениях. Пока есть небольшая конкуренция за переменную counter, и она вам не нужна для каждой записи, все должно быть в порядке.
Счетчики в C * - это совсем другая реализация. В более старых версиях C * они были немного печально известны своей способностью терять значения. Их реализация была переписана для значительно улучшенной стабильности, но для обеспечения уникальных операций потребуется тщательное планирование на стороне приложения. Вы можете представить двух клиентов, которые одновременно увеличивают счетчик, каждый думая, что они получили уникальное значение. Поэтому я думаю, что вы должны использовать LWT, если вам действительно нужно убедиться в уникальности.