我正在使用 Cassandra,需要处理特定的用例:
当表中尚不存在 ID 时,就会出现我遇到的问题。如果多个 Kafka 消费者同时收到相同的事件,两个消费者都会尝试通过 ID(不存在)获取记录,然后尝试更新它,从而导致竞争条件。
有没有办法在 Cassandra 中实现条件更新,特别是在记录尚不存在的情况下?我不知道如何解决这个问题。
提前致谢。
简单的答案是 Cassandra 提供了一种带有轻量级事务 (LWT) 的条件语句机制。您可以将
IF EXISTS
或 IF NOT EXISTS
等条件添加到 CQL 语句中,这样它们仅在条件为 true 时才会执行。
一个典型的用例是仅在用户尚未使用时才为其分配新用户名。例如:
INSERT INTO users_by_username (username, firstname, lastname)
VALUES ('alice123', 'Alice', 'Wonderland')
IF NOT EXISTS
在上面的示例中,用户名
alice123
仅当表中尚不存在时才会添加。
LWT 有其用途,但应仅在必要时使用,因为它们价格昂贵。 LWT 需要先读后写——Cassandra 必须先执行读取来评估条件,然后才能执行写入。
另一方面,请尽可能使用简单的
UPDATE
,因为无论记录是否存在,Cassandra 都会执行“更新插入”(不执行先读后写),因此速度非常快。干杯!