Массовая блокировка нескольких ключей 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.


person Ilya Davydov    schedule 08.09.2017    source источник


Ответы (1)


Hazelcast не предлагает метод bulkLock.

Вы можете оптимизировать этот код различными способами, но прежде чем мы перейдем к этому, было бы здорово узнать, почему вы хотите заблокировать эти записи и чего вы пытаетесь достичь.

person tom.bujok    schedule 08.09.2017