Увеличьте и получите значение счетчика

Есть ли способ увеличить счетчик, а затем вернуть значение в один вызов?

Или это единственный способ сделать 2 звонка?

1 ответ

Решение

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

Когда вы обновляете значение счетчика, CQL выглядит так:

UPDATE keyspace.table SET counter = counter + 1 WHERE a = b;

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

Таким образом, вам нужна гарантия того, что запись будет подтверждена достаточным количеством реплик, после чего вы сможете выполнить безопасное чтение, и это сделает его звучание действительно простым. В действительности существует процесс постепенного слияния / сравнения-и-набора, который происходит с одним приращением счетчика, более подробно здесь.

Операция чтения проста:

SELECT * FROM keyspace.table WHERE a = b;

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

for {
  inc <- database.table.update.where(_.a = b).modify(_.counter increment 1).future()
  value <- database.table.select(_.counter).where(_.a = b).one()
} yield value
Другие вопросы по тегам