Семафор (semaphor)#
Реализация и поведение распределенного семафора подсчета в DataGrid концептуально похожи на java.util.concurrent.Semaphore. Как и любой другой семафор, он поддерживает набор разрешений, которые запрашиваются с помощью метода acquire() и освобождаются с помощью release(). Семафор позволяет ограничить доступ к некоторому логическому или физическому ресурсу и синхронизировать поток выполнения. Семафор DataGrid позволяет выполнять подобные действия не только в пределах одной JVM, но и в масштабе всего кластера (на множестве удаленных узлов).
Пример, как создать распределенный семафор:
Ignite ignite = Ignition.start();
IgniteSemaphore semaphore = ignite.semaphore("semName", // Название распределенного семафора.
20, // Количество разрешений.
true, // Освободите полученное разрешение, если узел, которому оно принадлежало, покинул топологию.
true // Создайте, если его не существует.
);
После создания семафор может одновременно использовать несколько узлов кластера для реализации распределенной логики или ограничения доступа к распределенному ресурсу.
Пример использования семафора:
Ignite ignite = Ignition.start();
IgniteSemaphore semaphore = ignite.semaphore("semName", // Название распределенного семафора.
20, // Количество разрешений.
true, // Освободите полученное разрешение, если узел, которому оно принадлежало, покинул топологию.
true // Создайте, если его не существует.
);
// Запрашивает разрешение на доступ к ресурсу у семафора, блокируется до момента его доступности.
semaphore.acquire();
try {
// Разрешение семафора получено. Выполните распределенную задачу.
ignite.compute().run(() -> {
System.out.println("Executed on:" + ignite.cluster().localNode().id());
// Дополнительная логика.
});
} finally {
// Освобождает выданное ранее разрешение и возвращает его семафору.
semaphore.release();
}