【问题标题】:Cassandra Datastax Driver Retry PolicyCassandra Datastax 驱动程序重试策略
【发布时间】:2019-02-21 21:45:58
【问题描述】:

我们可以像这样创建一个集群实例。

 cluster = Cluster
.builder()
.addContactPoint("192.168.0.30")
.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
.build();

我们是否会提供在查询时必须重试请求的次数信息。

感谢任何建议。

谢谢

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    为了指定这些值,您必须创建自己的 RetryPolicy interface 实现。

    以下只是一个示例——按照您的规则进行自己的实现:

    public class CustomRetryPolicy implements RetryPolicy {
    
        private final int readAttempts;
        private final int writeAttempts;
        private final int unavailableAttempts;
    
        public CustomRetryPolicy(int readAttempts, int writeAttempts, int unavailableAttempts) {
            this.readAttempts = readAttempts;
            this.writeAttempts = writeAttempts;
            this.unavailableAttempts = unavailableAttempts;
        }
    
        @Override
        public RetryDecision onReadTimeout(Statement stmnt, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataReceived, int rTime) {
            if (dataReceived) {
                return RetryDecision.ignore();
            } else if (rTime < readAttempts) {
                return RetryDecision.retry(cl);
            } else {
                return RetryDecision.rethrow();
            }
    
        }
    
        @Override
        public RetryDecision onWriteTimeout(Statement stmnt, ConsistencyLevel cl, WriteType wt, int requiredResponses, int receivedResponses, int wTime) {
            if (wTime < writeAttempts) {
                return RetryDecision.retry(cl);
            }
            return RetryDecision.rethrow();
        }
    
        @Override
        public RetryDecision onUnavailable(Statement stmnt, ConsistencyLevel cl, int requiredResponses, int receivedResponses, int uTime) {
                    if (uTime < unavailableAttempts) {
                return RetryDecision.retry(ConsistencyLevel.ONE);
            }
            return RetryDecision.rethrow();
        }
    
    }
    

    这真的很容易做到......然后你将它传递给你的Cluster......

    RetryPolicy rc = new CustomRetryPolicy(3, 3, 2);
    Cluster cluster = Cluster.builder().addContactPoint("192.168.0.30").withRetryPolicy(rc).build();
    

    HTH, 卡罗

    【讨论】:

    • Cassandra 附带的重试策略的默认重试次数是多少??
    • 只有一次......据我所知,所有默认实现只重试一次......有一个默认实现以较低的一致性级别重试。
    • 请考虑从您的 onReadTimeout 中删除 if(dataRecieved) { return RetryDecision.ignore(); } 语句。如果用户请求了 quorum,这将导致数据安静地通过,并且用户认为他们有 quorum,而实际上并没有。
    【解决方案2】:

    对于使用 CassandraCSharpDriver NuGet Package for .NET 的任何 C# 开发人员,我无耻地复制了 Carlo Bertuccini 的出色答案并转换为 C# 语法:

    CustomRetryPolicy customRetryPolicy = new CustomRetryPolicy(10, 10, 10);
    cluster = Cluster.Builder().WithRetryPolicy(customRetryPolicy).WithCredentials(USER, PASS).AddContactPoint(NODE).WithCompression(CompressionType.Snappy).Build();
    

    类:

    public class CustomRetryPolicy : IRetryPolicy
    {
        private int readAttempts;
        private int writeAttempts;
        private int unavailableAttempts;
    
        public CustomRetryPolicy(int readAttempts, int writeAttempts, int unavailableAttempts)
        {
            this.readAttempts = readAttempts;
            this.writeAttempts = writeAttempts;
            this.unavailableAttempts = unavailableAttempts;
        }
    
        public RetryDecision OnReadTimeout(IStatement query, ConsistencyLevel cl, int requiredResponses, int receivedResponses, bool dataRetrieved, int nbRetry)
        {
            if (dataRetrieved)
            {
                return RetryDecision.Ignore();
            }
            else if (nbRetry < readAttempts)
            {
                return RetryDecision.Retry(cl);
            }
            else
            {
                return RetryDecision.Rethrow();
            }
        }
    
        public RetryDecision OnUnavailable(IStatement query, ConsistencyLevel cl, int requiredReplica, int aliveReplica, int nbRetry)
        {
            if (nbRetry < unavailableAttempts)
            {
                return RetryDecision.Retry(ConsistencyLevel.One);
            }
            return RetryDecision.Rethrow();
        }
    
        public RetryDecision OnWriteTimeout(IStatement query, ConsistencyLevel cl, string writeType, int requiredAcks, int receivedAcks, int nbRetry)
        {
            if (nbRetry < writeAttempts)
            {
                return RetryDecision.Retry(cl);
            }
            return RetryDecision.Rethrow();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 2020-12-26
      • 2016-07-21
      • 2016-02-27
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多