Оригинальный адрес блога:блог Пимайка
предисловие
Когда я в последнее время изучаю Java NIO, я часто вижу шаблон проектирования — шаблон Reactor. Я никогда раньше не касался этого шаблона, и он также применяется в Netty. Так что же такое шаблон Reactor? Зачем использовать шаблон Reactor? Как реализовать шаблон Reactor в NIO? Следующее раскроет тайну Reactor
Следующее введение относится к большому количеству актуальной информации в Интернете, поэтому будет некоторое дублирование некоторой информации в Интернете, пожалуйста, простите меня.
Введение в реактор
Reactor — это шаблон проектирования, связанный с вводом-выводом.NIO в Java, естественно, обеспечивает хорошую поддержку шаблона Reactor.Самый известный из них —Doung LeaБог это«Масштабируемый ввод-вывод в Java»Демонстрирует, как реализовать шаблон Reactor с помощью NIO.
Шаблон Reactor определяется в Википедии следующим образом:
The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers
Из приведенного выше описания мы можем получить несколько ключевых моментов:
- модель, управляемая событиями
- Обработка нескольких входов
- Используйте мультиплексирование для передачи событий соответствующему обработчику для обработки.
существуетNetty Learning Series II: модель реактора NIO и модель Netty ThreadКак говорится в этой статье, Reactor фактически используетразделяй и властвуйиуправляемый событиямиподумал о:
разделяй и властвуй: Полный процесс сетевой обработки в соединении обычно делится на прием, чтение, декодирование, обработку, кодирование и отправку. В режиме Reactor каждый шаг отображается в виде задачи, а наименьшая логическая единица, выполняемая серверным потоком, больше не является полным сетевым запросом, а является задачей, которая выполняется неблокирующим образом.
управляемый событиями: Каждая Задача соответствует определенному сетевому событию.Когда Задача готова, Reactor получает соответствующее уведомление о сетевом событии и распределяет Задачу на обработчик, привязанный к соответствующему сетевому событию, для выполнения.
Обобщите приведенные выше характеристики и объясните еще разРежим Reactor означает, что один или несколько входов событий доставляются сервисному процессору (Reactor) одновременно. Сервисный процессор отвечает за мониторинг состояния каждого события. Когда какое-либо событие готово, сервисный процессор получает уведомление о событии и отправляет событие Sent обработчику событий (Handler), привязанному к соответствующему сетевому событию, для выполнения
Режим Reactor также называется режимом Dispatcher., то есть мультиплексирование ввода-вывода единообразно отслеживает событие, а затем отправляет (Dispatch) в соответствующий поток обработки после получения события.
сравнение шаблонов
Разговор о паттерне Reactor напоминает мне паттерн Observer, они оба очень похожи, но паттерн Observer в основном используется дляодин ко многимВ случае , он определяет зависимость «один ко многим», позволяя нескольким объектам-наблюдателям прослушивать объект-субъект.Когда состояние наблюдателя изменяется, соответствующие наблюдатели должны быть уведомлены, чтобы эти наблюдатели могли автоматически обновляться. такНа самом деле они все же разные, паттерн Observer связан с одним источником событий, а паттерн Reactor связан с несколькими источниками событий..
Три реализации паттерна Reactor
Следующие инструкции относятся к колонке компьютерного времени старшего технического эксперта Alibaba Ли Юньхуа.Изучайте архитектуру с 0Введение в реактор в
Существует три типичных реализации шаблона Reactor:
- Одиночный реактор Однопоточный
- Многопоточность с одним реактором
- Многопоточность Master-Slave Reactor
Прежде чем представить три схемы, давайте сначала разберемся с несколькими ролями в режиме Reactor:
- Reactor: Отвечает за реагирование на события, привязку распространения событий к обработчику события.
- Handler: обработчик событий, привязанный к определенному типу события, отвечающий за выполнение задачи соответствующего события для обработки события.
- Acceptor: тип обработчика, который связывает событие подключения.Когда клиент инициирует запрос на подключение, Reactor передает событие принятия акцептору для обработки.
Одиночный реактор Однопоточный
PS: Описанные выше выбор, принятие, чтение и отправка являются API-интерфейсами сетевого программирования стандартной модели мультиплексирования ввода-вывода, а диспетчеризация и «бизнес-обработка» — это операции, которые необходимо выполнить.
Конкретные этапы программы следующие:
- Объект Reactor отслеживает события подключения через выбор и распределяет их через диспетчеризацию после получения события.
- Если это событие установления соединения, Acceptor обработает запрос на соединение посредством принятия, а затем создаст объект Handler для обработки последующей бизнес-обработки после завершения соединения.
- Если это не событие соединения, Reactor отправит обработчик, соответствующий соединению, для ответа.
- Обработчик завершит полный бизнес-процесс чтения -> бизнес-обработки -> отправки
Преимущества одиночного реактора с одним потоком:
- Модель простая, нет многопоточности, связи процессов, проблем с конкуренцией, все в одном потоке
недостаток:
- Существует только один процесс, и производительность многоядерного процессора не может быть задействована.Он может только развернуть несколько систем для использования многоядерного процессора, но это усложнит эксплуатацию и обслуживание.
- Когда обработчик обрабатывает бизнес в соединении, весь процесс не может обрабатывать события из других соединений, что может легко привести к узким местам в производительности.
Реализация одиночной реакторной отдельной нити в Nio
На следующем рисунке представлена блок-схема одного потока Reactor в Java NIO:
Что касается кода одиночного потока Reactor в NIO, см.Doung LeaВеликий Бог«Масштабируемый ввод-вывод в Java»
Многопоточность с одним реактором
Шаги программы:
- В основном потоке объект Reactor прослушивает событие подключения через выбор и распределяет его через диспетчеризацию после получения события.
- Если это событие установления соединения, оно будет обработано акцептором, который принимает соединение через accept и создает обработчик для обработки различных последующих событий соединения.
- Если это не событие установления соединения, Reactor вызовет обработчик, соответствующий соединению, чтобы отреагировать соответствующим образом.
- Обработчик отвечает только за реагирование на события и не выполняет бизнес-обработку.После того, как обработчик прочитает данные через чтение, он отправит их процессору для бизнес-обработки.
- Процессор завершит реальную бизнес-обработку в отдельном подпотоке, а затем отправит результат ответа обработчику основного процесса для обработки.После того, как обработчик получит ответ, он возвращает результат ответа клиенту через отправку
преимущество:
- Возможность в полной мере использовать вычислительную мощность многоядерных и многопроцессорных систем.
недостаток:
- Многопоточный обмен данными и доступ к ним более сложны
- Reactor отвечает за мониторинг и реагирование на все события и работает только в основном потоке, что станет узким местом в производительности, когда в одно мгновение будет много параллелизма.
Реализация многопоточности с одним реактором в Java NIO
На следующем рисунке представлена блок-схема реализации многопоточности с одним Reactor в Java NIO.
инструкция:
- Существует выделенный поток Reactor для прослушивания сервера ServerSocketChannel и получения запроса TCP-подключения от клиента.
- Пул потоков рабочего реактора отвечает за операции чтения/записи сетевого ввода-вывода, а поток NIO в пуле потоков отвечает за мониторинг событий SocketChannel, чтение, декодирование, кодирование и отправку сообщений.
- Один поток NIO может обрабатывать N ссылок одновременно, но одна ссылка регистрируется только в одном потоке NIO, чтобы предотвратить проблемы с параллельными операциями.
Что касается кода многопоточности с одним Reactor в NIO, см.Doung LeaВеликий Бог«Масштабируемый ввод-вывод в Java»
Multi-Reactor многопроцессорный/поточный
На следующем рисунке в качестве примера взят многопроцессорный мультипроцессор.
описание плана:
- Объект mainReactor в основном процессе отслеживает событие установления соединения посредством select, получает событие через Acceptor и назначает новое соединение дочернему процессу.
- SubReactor в дочернем процессе добавляет соединение, выделенное mainReactor, в очередь соединений для прослушивания и создает обработчик для обработки различных событий соединения.
- Когда происходит новое событие, subReactor вызовет соответствующий обработчик в соединении, чтобы ответить
- Обработчик завершает полный бизнес-процесс чтения -> бизнес-обработки -> отправки
Функции:
- Обязанности основного процесса и подпроцесса предельно ясны: основной процесс отвечает только за получение новых подключений, а подпроцесс отвечает за завершение последующей бизнес-обработки.
- Взаимодействие между основным процессом и дочерним процессом очень простое, основному процессу нужно только передать новое соединение дочернему процессу, а дочернему процессу не нужно возвращать данные
- Дочерние процессы независимы друг от друга и не нуждаются в синхронизации и совместном использовании (это ограничивается выборкой, чтением, отправкой и т. д., относящимися к сетевой модели, которые не нуждаются в синхронизации и совместном использовании, а также в «бизнес-обработке»). ", возможно, все еще нужно синхронизировать и расшарить)
Воплощение многопоточности Multi-Reactor в Java NIO
резюме
Приведенное выше резюме относится к анализу многих великих богов, и это правильно.Реакторный режимЕсть предварительное понимание.