Как преодолеть отставание от Нетти ChannelInboundHandler к kotlinx сопрограммы диспетчера?

Вопрос задан: 8 месяцев назад Последняя активность: 1 неделю назад
up 1 down

У меня есть мультиплексированного МОГ прикладной протокол I осуществивших этапы конвейера для обработки на классы данных Котлин, представляющих каждый тип сообщения в протоколе, в обоих направлениях. Там нет официального шаблона запроса-ответа; клиент и сервер могут посылать друг другу сообщения в любой момент срока службы сокета.

В протоколе, существует ограничение, что для любого подключенного клиента, сообщения обрабатываются последовательно. То есть, когда сервер получает сообщение от клиента, он не может обработать следующее сообщение от клиента, пока до один не будет полностью обработан. То же самое правило применяется на обработку сообщений от сервера клиенту. Это более или менее, как канал трубопровода обрабатываются в течение Netty; данный этап трубопровода может обрабатывать только одну вещь в то время. Это достаточно легко кодировать, имея блокирующий этап трубопровода на новый исполнитель группы.

Тем не менее, я хочу, чтобы написать обработчики для каждого типа сообщения клиент может отправить в виде подвешивания функций, как диапазон вещей мой сервер может сделать в ответ на сообщение клиента очень широк и может включать в себя контакт с другими серверами или базами данных , и группа типов сообщений также может блокировать участки состояния сервера внутри во время обработки, чтобы исключить другие параллельные подключенных клиентов. Так что я нужен способ преодоления в сопрограммное контексте из хвостовой части трубопровода канала, таким образом, что этап трубопровода «заблокирован» продолжать обрабатывать сообщения, но не предотвращает обработку трубопроводов других каналов на данном этапе, и без создания единого исполнителя потока событий за сокет.

Я думал использовать отдельный диспетчерский и событие цикла от Нетти представлять обработку каждого сеанса клиента, используя актер, чтобы представить каждый, таким образом, что полученные сообщения посылается на канал почтового ящика актера и сопрограмма обрабатывает их в порядке поступления, и Я могу отменить актер и его отмены закрыть SocketChannel и наоборот. Но это довольно некрасиво и не чувствует себя в духе Нетти.

т.Л., д-р я задаюсь вопросом, что является лучшим способом реализации этапа трубопровода, который интегрирует функцию суспендирующего чисто с исполнителем группы?

1 ответ

up -1 down

Прошлое время, я был построен мост для подключения Vert.x (на основе Netty) и сопрограмму. https://paste.ubuntu.com/p/9VxZkdn9tt/(Внимание: есть некоторые ошибки я не исправлен.)

Vert.x обеспечивает ReadStream стиля обратного вызова. Я преобразовать его в блок синхронизации стиле InputStream в сопрограммы. подобно InputStream в java.io.

Безусловно, это не самый лучший способ, чтобы избежать проблем. Но внешний вид, асинхронная стиль имеет некоторые проблемы когда-то.