【发布时间】:2019-02-21 21:45:58
【问题描述】:
我们可以像这样创建一个集群实例。
cluster = Cluster
.builder()
.addContactPoint("192.168.0.30")
.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
.build();
我们是否会提供在查询时必须重试请求的次数信息。
感谢任何建议。
谢谢
【问题讨论】:
标签: cassandra
我们可以像这样创建一个集群实例。
cluster = Cluster
.builder()
.addContactPoint("192.168.0.30")
.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
.build();
我们是否会提供在查询时必须重试请求的次数信息。
感谢任何建议。
谢谢
【问题讨论】:
标签: cassandra
为了指定这些值,您必须创建自己的 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, 卡罗
【讨论】:
if(dataRecieved) { return RetryDecision.ignore(); } 语句。如果用户请求了 quorum,这将导致数据安静地通过,并且用户认为他们有 quorum,而实际上并没有。
对于使用 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();
}
}
【讨论】: