0

我有一个相当复杂的 Web 应用程序,它在 Cassandra 数据库中创建 HTML 页面。

在创建页面时,它会在该页面中保存一个状态,以反映它正在处理的事实。

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和第二次之间的时间太短而导致 Cassandra 集群混乱而发生这种情况?(即认为两者几乎一起到达并选择其中之一,在这几种失败的情况下恰好是错误的?)

4

1 回答 1

0

当使用 C++ 驱动程序(以及我确定的其他驱动程序)时,两个 INSERT 命令可能最终被发送到两个不同的管道。这是因为驱动程序处理工作线程,并且命令可以在任一工作线程管道中结束。

这意味着即使您发送 CREATE 和随后的 NORMAL,线程管道可能最终会先发送 NORMAL,然后再将 CREATE 发送到 Cassandra(即交换数据首先发送到 C++ 驱动程序的顺序。)然后您最终会得到一个状态创建...

这不能直接解决。相反,您可能希望在该页面上工作时使用锁定,一旦工作完成,还将状态更新为 NORMAL 以防万一它是其他东西,然后解锁。如果你有一个超时的锁,那么你永远不应该创建一个完整的死锁(即一个进程处理页面 A 然后 B 在处理 B 之前没有释放页面 A 上的锁,另一个进程首先处理页面 B 然后 A ... )

于 2016-07-03T04:01:00.993 回答