У меня есть протокол приложения мультиплексированной передачи. Я реализовал этапы конвейера для обработки в классы данных Kotlin, представляющие каждый тип сообщения в протоколе, в обоих направлениях.Не существует формального шаблона запрос-ответ;клиент и сервер могут отправлять друг другу сообщения в любой точке срока службы сокета.
В протоколе существует ограничение, согласно которому для любого подключенного клиента сообщения обрабатываются последовательно.То есть, когда сервер получает сообщение от клиента, он не может обработать следующее сообщение от клиента, пока предыдущее не будет полностью обработано.Это же правило применяется к клиенту, обрабатывающему сообщения с сервера.Это более или менее то, как канальные конвейеры обрабатываются в Netty;данный этап конвейера может обрабатывать только одну вещь за один раз.Это достаточно просто кодировать, имея этап конвейерного блокирования в новой группе исполнителей.
Однако я хочу написать обработчики для каждого типа сообщений, которые клиент может отправлять в виде приостановленных функций, так какДиапазон действий, которые мой сервер может выполнять в ответ на клиентское сообщение, очень широк и может включать в себя связь с другими серверами или базами данных, и группа типов сообщений может также блокировать части состояния сервера во время обработки для исключения других одновременно подключенных клиентов.Поэтому мне нужен способ соединения с сопрограммным контекстом из хвостовой части конвейера канала, чтобы этап конвейера «блокировался» от продолжения обработки сообщений, но не мешал обработке конвейеров других каналов на этом этапе,и без создания единственного исполнителя событий потока для сокета.
Я думал использовать отдельный диспетчер и цикл событий от Netty для представления обработки каждого сеанса клиента, используя субъект для представления каждого, такого как полученные сообщенияотправлены на канал почтового ящика актера, и сопрограмма обрабатывает их в полученном порядке, и я могу отменить актера и при его отмене закрыть SocketChannel
и наоборот.Но это довольно некрасиво и не в духе Netty.
tl; dr Мне интересно, каков наилучший способ реализации этапа конвейера, который аккуратно объединяет функцию приостановки со своей группой исполнителей?