Hazelcast IMap tryLock навалом нескольких ключей
У меня есть кластерная программа, где каждый поток хочет заблокировать набор ключей. Как я понял самое простое решение с использованием hazelcast:
private void lock(SortedSet<String> objects) {
try {
IMap<String, String> lockMap = getLockMap();
for (; ; ) {
SortedSet<String> lockedObjects = new TreeSet<>();
for (String object : objects) {
try {
boolean locked = lockMap.tryLock(object, 0, null, maxBlockTime, TimeUnit.MILLISECONDS);
if (locked) {
lockedObjects.add(object);
} else {
for (String lockedObject : lockedObjects) {
lockMap.unlock(lockedObject);
}
lockedObjects.clear();
break;
}
} catch (Exception e) {
for (String lockedObject : lockedObjects) {
try {
lockMap.unlock(lockedObject);
} catch(Exception ignored) {
}
}
throw e;
}
}
if (!lockedObjects.isEmpty()) {
return lockedObjects;
}
Thread.sleep(waitTime);
}
}
}
Основная проблема этого кода в том, что этот код генерирует много трафика в сети и запросов на Hazelcast. Может ли кто-нибудь порекомендовать, как этот код может быть оптимизирован?
Я не смог найти большую функциональность tryLock в Hazelcast IMap.
1 ответ
Hazelcast не предлагает bulkLock
метод.
Вы можете оптимизировать этот код различными способами, но прежде чем мы доберемся до этого, было бы здорово узнать, почему вы хотите заблокировать эти записи и что вы пытаетесь достичь.