是否有可能在成功创建记录的 INSERT 操作后从 Cassandra 获得回调?

Is it possible to get a callback from Cassandra after the INSERT operation that the record was created successfully?

我遇到了非常奇怪的行为,我试图了解在哪些情况下可能会发生这种情况。在我的 Python 应用程序中,我通过 driver.

访问 Cassandra 数据库

正如您在下面看到的,首先,我执行了一个 INSERT 操作,它在 table 中创建了一条记录。接下来,我执行 SELECT 操作,应该 return 之前创建的最后一条消息。有时 select 操作 return 对我来说是空值。我假设 Cassandra 有一个内部调度程序,可以让 INSERT 任务工作。但是,当我尝试通过SELECT 操作获取最后一条记录时,该记录尚未创建。这可能吗?

问题:

是否可以在创建记录成功的INSERT操作后得到Cassandra的回调?

片段:

import uuid
import sys
from cassandra import ConsistencyLevel
from cassandra.query import SimpleStatement, dict_factory


def send_message(chat_room_id, message_author_id, message_text):
    message_id = uuid.uuid1()


    first_query = """
    insert into messages (
        created_date_time,
        chat_room_id,
        message_id,
        message_author_id,
        message_text
    ) values (
        toTimestamp(now()),
        {0},
        {1},
        {2},
        {3}
    );
    """.format(
        chat_room_id,
        message_id,
        message_author_id,
        message_text
    )

    first_statement = SimpleStatement(
        first_query,
        consistency_level=ConsistencyLevel.LOCAL_QUORUM
    )

    try:
        db_connection.execute(first_statement)
    except Exception as error:
        logger.error(error)
        sys.exit(1)

    db_connection.row_factory = dict_factory

    second_query = """
    select
        created_date_time,
        chat_room_id,
        message_id,
        message_author_id,
        message_text
    from
        messages
    where
        chat_room_id = {0}
    and
        message_id = {1}
    limit 1;
    """.format(
        chat_room_id,
        message_id
    )

    try:
        message = db_connection.execute(second_query).one()
    except Exception as error:
        logger.error(error)
        sys.exit(1)

    print(message) # Sometimes when it's the first message in the chat room I see a "None" value.

当你执行第一个插入语句并得到结果时,这意味着 Cassandra 完成了你的插入语句。

看起来您插入的一致性级别 (CL) 为 LOCAL_QUORUM,但是当您 select 相同的记录时未设置 CL。

默认情况下,python 驱动程序使用 LOCAL_ONE 作为一致性级别(如果未设置)。

https://docs.datastax.com/en/developer/python-driver/3.24/getting_started/#setting-a-consistency-level

在您的情况下,当您使用 LOCAL_QUORUM 插入记录时,假设您的复制因子为 3,则 3 个副本节点中至少有 2 个具有您的数据。

(请注意,Cassandra 始终尝试写入所有副本节点。)

然后你用LOCAL_ONE查询,你可能会命中那两个节点并得到结果,或者你可能会命中那个未能写入你的记录的节点。

为了在Cassandra中实现强一致性,你必须使用LOCAL_QUORUM进行读写。

也尝试对 select 使用 LOCAL_QUORUM,或通过默认执行配置文件将默认一致性级别设置为 LOCAL_QUORUMhttps://docs.datastax.com/en/developer/python-driver/3.24/getting_started/#execution-profiles