Увеличьте и получите значение счетчика
Есть ли способ увеличить счетчик, а затем вернуть значение в один вызов?
Или это единственный способ сделать 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