当前位置: 首页 > 知识库问答 >
问题:

Cassandra CAS 插入超时,用于具有毫秒级延迟的请求

别兴国
2023-03-14

我们正在对我们的cassandra集群(3个节点,复制因子3)进行负载测试,并开始接收一个表上CAS插入操作的偶尔WriteTimeoutExceptions:

CREATE TABLE users.by_identity (
        account ascii,
        domain ascii,
        identity text
        PRIMARY KEY ((account, domain), identity)
    );

我们正在使用IF NOT EXISTS子句对此表进行插入。当将负载增加到

com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency SERIAL (2 replica were required but only 1 acknowledged the write)

超时的WriteType是CAS,并且只对此表引发异常。执行时间总是

知道我们遇到的问题是什么吗?为什么毫秒延迟的请求会超时?

我们在卡桑德拉v3.0.8和数据轴Java驱动程序v3.1.0上。

共有1个答案

邴宏大
2023-03-14

很抱歉,回答晚了,但您可能遇到了以下错误:https://issues.apache.org/jira/browse/CASSANDRA-9328

您可以通过降低并发性来进行确认,因此一次只有一个请求(如果您的请求非常快,您可能仍然可以每秒一个接一个地执行10个快速请求,没有任何并发),并保留您的集群设置(3个节点,复制因子3)或保留您的请求速率为10/s,并将您的集群设置更改为单个节点。如果你这样做,你可能不会看到任何超时

不幸的是,错误报告没有提供任何伪代码如何解决这个问题,但确实说你应该自己检查状态,看看是否真的发生了写入,并在此基础上重试。如果您的写入是幂等的,也许您只需重试即可。

不幸的是,出于我的目的,我们的应用程序非常复杂,如果没有许多其他工作,我们无法解决,所以我们仍然生活在这个错误中。如果这最终成为您遇到的问题,我有兴趣在伪代码中看到一个示例,说明您如何能够解决它,因为它也可能为遇到此问题的其他人提供灵感。

 类似资料:
  • 我正在尝试在延迟后在wiremock中生成响应,其中延迟来自传入的请求。e、 g请求中用户的姓氏是“delay_10000”,然后延迟10000毫秒,或者delay_20000,然后延迟20000。。。。。 谁能确认哪些字段可以模板化吗。doco建议使用“响应头和正文”,其他地方建议使用bodyFileName(我正在使用),但它没有说明其他响应字段是否可以模板化。 现在我看到了 首先,我可以看到

  • 问题内容: 将较大的毫秒值传递给时,我遇到了一些意外行为。例如, 和 两者都导致几乎立即运行,就好像我已经过去了,而不是因为延迟而占用了大量资源。 为什么会这样? 问题答案: 这是由于setTimeout使用32位int存储延迟,因此允许的最大值为 如果你试试 您会遇到问题。 我只能假定这会导致JS Engine中某种形式的内部异常,并导致函数立即触发而不是根本不触发。

  • 我现在用SDL2编程。所有这些都可以正常工作,但我对方法有一个问题。通常,它应该以毫秒为单位返回应用程序的总时间,但它总是在大部分时间返回值0,有时返回值1。 我用标志初始化SDL。 以下代码的问题是循环太快,因此增量时间小于1 ms。是否有方法实现更高的精度?

  • 我得到连接不可用错误msg与下面的配置xml映射。请建议我在beolw代码中做错了什么,或者这是另一个问题。根据我的调查,这是HikariCP、HiberNate和Spring Batch的一个intregation问题。2.0.3 5.1.64.0.0.RELEASE3.0.0.RELEASE3.0.0.RELEASE0.5 2.3.2 4.3.5。最终 错误:-- 请帮帮我。

  • 问题内容: 假设我有一个任务要从java.util.concurrent.BlockingQueue中提取元素并进行处理。 如果可以动态更改频率,我该如何安排/重新安排任务? 想法是获取数据更新流并将其批量传播到GUI 用户应该能够更改更新频率 问题答案: 我认为您无法更改固定速率的延迟。我认为您需要使用schedule()执行一次操作,并在完成后再次计划(如果需要,可以更改超时)。

  • 问题内容: 在一些脚本中,我可以找到例如 而不是简单 立即调用$ timeout的目的是什么? 问题答案: 这是一个hack。:)但通常的目的是等待周期结束,然后设置为。完成所有监视后,将调用超时。