背景
CuratorZookeeperClient是ZooKeeper的Java客户端的一个封装,使得客户端对ZooKeeper的访问更简单,更容易出错。 它提供以下功能:
-
连续连接管理 - ZooKeeper有关于连接管理的许多注意事项(有关详细信息,请参阅“ZooKeeper常见问题”)。 策展人ZookeeperClient自动管理其中大部分。
-
操作重试实用程序 - 提供重试操作的方法
-
测试ZooKeeper服务器 - 提供了一个可以用于测试用例和实验的一个正在进行的,独立的ZooKeeper测试服务器
方法文档
方法(Method) | 描述(Description) |
---|---|
Constructor |
创建与给定的ZooKeeper集群的连接。你可以通过一个可选的观察者。您必须提供重试策略。 |
getZooKeeper() |
返回被管理的ZooKeeper实例。重要注意事项:a)连接完成需要时间,应在使用其他方法之前验证连接是否已完成。 b)受管理的ZooKeeper实例可能由于某些事件而改变。不要长时间坚持实例。总是从getZooKeeper()获得新的参考。 |
isConnected() |
如果ZooKeeper客户端当前已连接,则返回true(这可能会由于错误而始终更改) |
blockUntilConnectedOrTimedOut() |
一个方便的方法,直到初始连接成功或超时为止 |
close() |
关闭连接 |
setRetryPolicy() |
更改重试策略 |
newRetryLoop() |
分配一个新的重试循环 - 参见下面的详细信息 |
重试循环
由于各种原因,ZooKeeper群集上的操作可能会失败。最佳做法规定应重试这些操作。重试循环机制提供了这样做的手段。每个操作都应该被包裹在重试循环中。这是规范用法:
RetryLoop retryLoop = client.newRetryLoop();
while ( retryLoop.shouldContinue() )
{
try
{
// perform your work
...
// it's important to re\-get the ZK instance as there may have been an error and the instance was re\-created
ZooKeeper zk = client.getZookeeper();
retryLoop.markComplete();
}
catch ( Exception e )
{
retryLoop.takeException(e);
}
}
重试循环维护重试计数,并确定给定错误是否可重试。 如果操作是重试的候选者,则会调用重试策略来确定重试是否应继续。
为了方便起见,RetryLoop有一个静态方法,它可以使Callable执行一个完整的重试循环。 例如。
RetryLoop.callWithRetry(client, new Callable<Void>()
{
@Override
public Void call() throws Exception
{
// do your work here - it will get retried if needed
return null;
}
});
重试策略
重试策略是改变重试行为的机制。 它由RetryPolicy接口抽象,它具有一个方法:public boolean allowRetry(int retryCount,long elapsedTimeMs); 在尝试重试之前,将使用当前重试计数和操作的经过时间来调用allowRetry()。 如果策略允许,则尝试重试。 如果没有,抛出异常。
提供了几个重试策略实现(在com.netflix.curator.retry包中):
策略名称(Policy Name) | 说明(Description) |
---|---|
ExponentialBackoffRetry |
重试次数的重试策略,在重试次数增加之间增加休眠时间 |
RetryNTimes |
重试次数最多的重试策略 |
RetryOneTime |
重试次数只有一次 |
RetryUntilElapsed |
一个重试策略,直到经过一段时间才能重试 |