【问题标题】:Datastax Cassandra Driver Retry Policy Delay?Datastax Cassandra 驱动程序重试策略延迟?
【发布时间】:2016-06-04 09:51:12
【问题描述】:

我正在使用 Datastax Cassandra 驱动程序并设置了 RetryPolicy 以在主机不可用时重试。但是,我注意到它会尽可能快地重试。我想将其更改为在重试之间增加延迟,而不是在集群陷入困境时锤击集群。这对于OVERLOADED 请求错误尤其重要,因为我确实想在这些情况下重试,但会有很大的延迟。

在哪里放置延迟的正确位置以及正确的机制是什么?我应该在我的 RetryPolicy 中添加一个 Thread.sleep(...) 吗?

我不介意占用在线请求槽(针对最大数量的进行中请求),但如果我们还没有进行中的请求,我不能完全阻止其他写入限制。

【问题讨论】:

    标签: cassandra datastax-java-driver


    【解决方案1】:

    您可以通过添加延迟来实施自己的重试策略。最简单的方法是选择默认重试的源代码并自己修改它以实现重试或类似的指数延迟。

    对于指数延迟,看http://docs.datastax.com/en/drivers/java/3.0/com/datastax/driver/core/policies/ExponentialReconnectionPolicy.html的源码就知道是怎么回事了

    【讨论】:

    • 我已经有一个 ExponentialReconnectionPolicy 设置,但它似乎没有用于超时重试决策的情况。也许它被用于不可用的决定,尽管它看起来并非如此。指数重新连接策略的工作方式是要求实现者提供超时,然后 Cassandra 管理延迟。在 RetryDecisions 的情况下,我似乎没有延迟的选项,所以我必须Thread.sleep()。我担心在重试策略中休眠是错误的做法,因为它可能会阻塞请求线程。
    • 那么 RetryPolicy != ReconnectionPolicy ... 只需创建自己的 ExponentialRetryPolicy
    • 您对在 RetryPolicy 中休眠的担忧是有效的,重试是在 Netty 工作者中评估的,因此如果您在任何 on* 方法中休眠,它都会阻塞 netty 工作者线程。
    • @AndyTolbert 你能详细说明被阻止的网络工作者的后果吗?您对如何延迟有什么建议吗?
    • 阻止 netty worker 可以防止网络套接字上的写入和读取。我认为这使得通过 RetryPolicy 使用延迟成为非首发。相反,最好的方法是处理客户端代码中的异常并在该级别安排 session.execute 的重试。
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 2016-07-21
    • 2016-02-27
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多