Замок Hazelcast - случай смерти - PullRequest
1 голос
/ 14 октября 2019

Что произойдет, если один из экземпляров кластера Hazelcast получит блокировку и умрет в заблокированном состоянии? например,

if (hz.getCPSubsystem().getLock("lockName").tryLock(500, TimeUnit.MILLISECONDS)){
    try{
      System.exit(0);
    }finally {
        hz.getCPSubsystem().getLock("lockName").unlock();
    }

}

1 Ответ

2 голосов
/ 14 октября 2019

Краткая версия: подсистема CP имеет механизм сеанса, который отслеживает жизнеспособность всех участников. Когда он узнает, что член, удерживающий замок, умер, замок будет снят. Механизм пульса сеанса может быть настроен, если необходимо, для удовлетворения требований к производительности конкретного приложения.

Длинная версия: я бы посоветовал прочитать это сообщение в блоге: https://hazelcast.com/blog/long-live-distributed-locks/ и, в частности, раздел «что произойдет, если держатель замка умрет».

Один из самых хитрых аспектов обеспечения надежности этого типа кода - это то, что происходит, когда возникает проблема с сетью ... например, держатель замка может отключиться, и тактовые импульсы не будут видны. Таким образом, кластер объявляет держатель блокировки мертвым, снимает блокировку и назначает ее кому-то еще. Затем держатель замка возвращается в оперативный режим и пытается продолжить обработку, думая, что у него все еще есть замок. Реализация FencedLock в Hazelcast распознает блокировку как устаревшую и не позволяет владельцу устаревшей блокировки продолжить - он должен повторно захватить блокировку, прежде чем предпринимать какие-либо действия, охватываемые блокировкой.

...