Распределенная блокировка Geode/Gemfire в конфигурации сервер-клиент
Я следую этому документу: http://gemfire.docs.pivotal.io/docs-gemfire/latest/developing/distributed_regions/locking_in_global_regions.html чтобы создать регион с глобальной областью действия для использования распределенной блокировки.
Cache.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>
Код после GemFireCache, созданный из gemfire.properties и cache.xml:
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.getDistributedLock("entrykey"); а затем иметь замок для координации между экземплярами.
Тем не менее, когда я позвонил getDistributedLock
, Я получил IllegalStateException: only supported for GLOBAL scope, not LOCAL
И я обнаружил, что конструктор ClientRegionFactoryImpl принудительно устанавливает область действия на Local независимо от того, что настроено в атрибутах региона, и у меня нет API для его перезаписи. Эта строка: https://github.com/apache/incubator-geode/blob/develop/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java#L85
Итак, вопрос в том, должен ли я использовать Distributed Lock from Client, если я использую конфигурацию DS клиент-сервер? Если нет, что я должен сделать, чтобы клиенты блокировали друг друга для синхронизации при необходимости?
1 ответ
API-интерфейсы DistributedLock и RegionDistributedLock для класса Region доступны только на сервере. Чтобы использовать эти блокировки от клиента, вам нужно написать функции, которые вы развертываете на серверах. Клиент тогда скажет Серверу выполнить Функцию, где он может манипулировать Region, а также API-интерфейсами DistributedLock и RegionDistributedLock. Более подробную информацию о FunctionService можно найти по адресу:
http://geode.apache.org/docs/guide/developing/function_exec/chapter_overview.html.