我知道Apache Curator可以执行构建在zookeeper顶部的分布式锁定功能。根据Apache Curator官方网站上发布的文档,它看起来很容易使用。例如:
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("host:ip",retryPolicy);
client.start();
InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path);
if(lock.acquire(10, TimeUnit.SECONDS))
{
try { /*do something*/ }
finally { lock.release(); }
}
但是“InterProcessSemaphoreMutex”的第二个参数“path”是什么意思?它意味着基于API的“锁定路径”但究竟是什么呢?谁能举个例子呢?
如果我有数百万的锁,我是否必须创造数百万的“锁定之路”? zookeeper集群的最大锁(znode)数量是否有限制?或者,当进程释放时,我们可以删除此锁吗?
答案 0 :(得分:9)
ZooKeeper呈现的是分布式文件系统。对于任何ZooKeeper操作,配方等,您可以编写" znodes"到特定的路径并注意变化。请参阅此处:http://zookeeper.apache.org/doc/trunk/zookeeperOver.html#Simple+API(关于znodes)。
对于策展人食谱,它需要知道您要用来执行配方的基本路径。对于InterProcessSemaphoreMutex,路径是每个参与者应该使用的路径。即进程1和进程2都希望同时争用锁。因此,它们都使用相同的路径分配InterProcessSemaphoreMutex实例,例如" / my / lock"。将路径视为锁定标识符。在同一个ZooKeeper集群中,您可以使用不同的路径进行多次锁定。
希望这会有所帮助(免责声明:我是策展人的主要作者)。
答案 1 :(得分:1)
关于收割者的一些例子。
@Test
public void testSomeNodes() throws Exception
{
Timing timing = new Timing();
ChildReaper reaper = null;
CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
try
{
client.start();
Random r = new Random();
int nonEmptyNodes = 0;
for ( int i = 0; i < 10; ++i )
{
client.create().creatingParentsIfNeeded().forPath("/test/" + Integer.toString(i));
if ( r.nextBoolean() )
{
client.create().forPath("/test/" + Integer.toString(i) + "/foo");
++nonEmptyNodes;
}
}
reaper = new ChildReaper(client, "/test", Reaper.Mode.REAP_UNTIL_DELETE, 1);
reaper.start();
timing.forWaiting().sleepABit();
Stat stat = client.checkExists().forPath("/test");
Assert.assertEquals(stat.getNumChildren(), nonEmptyNodes);
}
finally
{
CloseableUtils.closeQuietly(reaper);
CloseableUtils.closeQuietly(client);
}
}
Java Code Examples for org.apache.curator.framework.recipes.locks.Reaper