JGroups - JGroups

JGroups
Разработчики) Бела Бан
Стабильный выпуск (ы)
5.x 5.1.6.Финал / 6 апреля 2021 г . ; 6 месяцев назад ( 2021-04-06 )
4.x 4.2.12.Финал / 1 апреля 2021 г . ; 6 месяцев назад ( 2021-04-01 )
Репозиторий github .com / belaban / JGroups
Написано в Джава
Операционная система Кроссплатформенность
Размер 2,1 МБ
Тип надежная многоадресная система
Лицензия Лицензия Apache 2.0
Веб-сайт www .jgroups .org

JGroups - это библиотека для надежного общения «один-к-одному» или «один-ко-многим», написанная на языке Java .

Его можно использовать для создания групп процессов, участники которых отправляют сообщения друг другу. JGroups позволяет разработчикам создавать надежные многоточечные (многоадресные) приложения, где надежность является проблемой развертывания. JGroups также освобождает разработчика приложений от самостоятельной реализации этой логики. Это значительно экономит время разработки и позволяет развертывать приложение в различных средах без изменения кода.

Функции

  • Создание и удаление группы. Члены группы могут быть распределены по LAN или WAN.
  • Присоединение и выход из групп
  • Обнаружение членства и уведомление о присоединившихся / оставленных / аварийных участниках
  • Обнаружение и удаление разбившихся элементов
  • Отправка и получение сообщений от участника к группе (точка-многоточка)
  • Отправка и получение сообщений между участниками (точка-точка)

Образец кода

Этот код ниже демонстрирует реализацию простого IRC- клиента командной строки с использованием JGroups:

public class Chat extends ReceiverAdapter {
    private JChannel channel;

    public Chat(String props, String name) {
        channel = new JChannel(props)
            .setName(name)
            .setReceiver(this)
            .connect("ChatCluster");
    }

    public void viewAccepted(View view) {
        System.out.printf("** view: %s\n", view);
    }

    public void receive(Message msg) {
        System.out.printf("from %s: %s\n", msg.getSource(), msg.getObject());
    }

    private void send(String line) {
        try {
            channel.send(new Message(null, line));
        } catch (Exception e) {}
    }

    public void run() throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            System.out.print("> ");
            System.out.flush();
            send(in.readLine().toLowerCase());
        }
    }

    public void end() throws Exception {
        channel.close();
    }

    public static void start(Chat client) throws Exception {
        try {
            client.run();
        } catch (Exception e) {
        } finally {
            client.end();
        }
    }

    public static void main(String[] args) throws Exception {
        String props = "udp.xml";
        String name;

        for (int i = 0; i < args.length; i++) {
            if (args[i].equals("-props")) {
                props = args[++i];
                continue;
            }

            if (args[i].equals("-name")) {
                name = args[++i];
                continue;
            }

            System.out.println("Chat [-props XML config] [-name name]");
            return;
        }

        start(new Chat(props, name));
    }
}

JChannel создается из конфигурации XML (например udp.xml). Канал - это конечная точка для присоединения к кластеру.

Затем устанавливается получатель, что означает, что будут вызваны два обратных вызова:

  • viewAccepted(View view) когда новый участник присоединяется или существующий участник покидает кластер
  • receive(Message msg) когда получено сообщение от другого члена кластера

Затем канал присоединяется к кластеру ChatCluster. С этого момента сообщения можно отправлять и получать, плюс новое представление (включая этого члена) будет установлено во всех членах кластера (включая вновь присоединившегося члена).

Все, что набирается в основном цикле, приводит к созданию сообщения, которое будет отправлено всем членам кластера, включая отправителя.

Экземпляры приложения чата можно запускать в одном процессе, на одном компьютере, на разных хостах в локальной сети, на хостах в разных сетях или в облаке. Код остается прежним; нужно только изменить конфигурацию.

Например, в локальной сети может использоваться многоадресная рассылка IP. Когда многоадресная рассылка IP отключена, TCP может использоваться в качестве транспорта. При запуске в облаке будет использоваться TCP плюс протокол обнаружения облака и так далее ...

Гибкий стек протоколов

Самая мощная особенность JGroups - это гибкий стек протоколов, который позволяет разработчикам адаптировать его в точном соответствии с требованиями их приложений и характеристиками сети. Преимущество этого в том, что вы платите только за то, что используете. Смешивая и согласовывая протоколы, можно удовлетворить различные требования приложений. JGroups поставляется с рядом протоколов (но каждый может написать свой собственный), например

  • Транспортные протоколы: UDP ( IP Multicast ), TCP
  • Фрагментация больших сообщений
  • Протоколы обнаружения для обнаружения начального членства присоединяющегося узла
  • Надежная одноадресная и многоадресная передача сообщений. Потерянные сообщения передаются повторно
  • Обнаружение сбоев: разбитые участники исключаются из членства
  • Протоколы заказа: Fifo, Total Order (на основе секвенсора или токена)
  • Членство и уведомление о присоединившихся или потерпевших крах участников
  • Обнаружение и объединение сетевого раздела (разделенного мозга)
  • Управление потоком
  • Шифрование и аутентификация (включая поддержку SASL)
  • Сжатие

Строительные блоки

Строительные блоки - это классы, расположенные по каналам JGroups, которые обеспечивают абстракции более высокого уровня, такие как

  • RPC для отдельных или всех узлов кластера
  • Распределенные кеши
  • Распределенные блокировки
  • Распределенные атомные счетчики
  • Распределенное выполнение задачи

использованная литература

внешние ссылки