提问者:小点点

服务器-客户端配置中的Geode/Gemfire分布式锁定


我正在遵循此文档:http://gemfire.docs.pivotal.io/docs-gemfire/latest/developing/distributed_regions/locking_in_global_regions.html创建具有全局范围的区域以使用分布式锁定。

缓存. xml:

<client-cache>
<pool>…definition…</pool>
…
<!--region-attributes For Lock region-->
<region-attributes id="GZ_GLOBAL_REGION_LOCK_ATTRIBUTES" scope="global" pool-name="Zero"/>
…
</client-cache>

从gemfire.properties和cache. xml创建GemFireCache后的代码:

private Region<String, Object> getOrCreateLockRegion(GemFireCache gemfireCache) {
    Region<String, Object> region = gemfireCache.getRegion(lockRegionName);
    if (region == null) {
        if(!isUsingClientCache) {
            region = createRegionFactory((Cache)gemfireCache, String.class, Object.class, lockRegionAttributesID).create(lockRegionName);
        } else {
            region = createClientRegionFactory((ClientCache) gemfireCache, String.class, Object.class, lockRegionAttributesID).create(lockRegionName);
        }
    }
    return region;
}

protected <K, V> RegionFactory<K, V> createRegionFactory(Cache gemfireCache, Class<K> keyClass, Class<V> valueClass, String regionAttributeRefID) {
    return gemfireCache
            .<K, V>createRegionFactory(regionAttributeRefID)
            .setKeyConstraint(keyClass)
            .setValueConstraint(valueClass);
}

protected <K, V> ClientRegionFactory<K, V> createClientRegionFactory(ClientCache gemfireCache, Class<K> keyClass, Class<V> valueClass, String regionAttributeRefID) {
    return gemfireCache
            .<K, V>createClientRegionFactory(regionAttributeRefID)
            .setKeyConstraint(keyClass)
            .setValueConstraint(valueClass);
}

我想这会给我一个带有Scope.Global的区域,这样我就可以调用region. getGenertedLock("entrykey");然后让锁在实例之间进行协调。

但是,当我调用getPubltedLock时,我得到了一个IllegalStateException:仅支持GLOBAL范围,不支持LOCAL

我发现ClientRegion onFactoryImpl的构造函数强制作用域为Local,而不管在region-属性中配置了什么,我没有API覆盖它。这一行:https://github.com/apache/incubator-geode/blob/develop/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java#L85

所以问题是,如果我使用客户端-服务器DS配置,我应该使用来自客户端的分布式锁吗?如果没有,我应该做什么来使客户端相互锁定以在必要时同步?


共1个答案

匿名用户

Region类上的分布式锁和区域分布式锁API仅在服务器中可用。为了从客户端使用这些锁,您必须编写部署到服务器的函数。然后,客户端将告诉服务器执行函数,它可以在其中操作区域以及分布式锁和区域分布式锁API。有关FunctionService的更多信息,请访问:

http://geode.apache.org/docs/guide/developing/function_exec/chapter_overview.html.