Семафор (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();
}