Как отправить событие другому обработчику в netty? - PullRequest
3 голосов
/ 23 ноября 2011

В отличие от boost.asio, netty не имеет метода чтения. Это неудобно в следующей ситуации: Узел управления управляет некоторыми узлами, и клиенты подключаются к узлу управления для получения информации, находящейся в узлах. Когда узел управления получает запрос клиента, он отправляет запрос соответствующему узлу и ожидает ответа узла. Когда узел ответа и узел управления получает информацию в своей функции «messageReceived», как отправить информацию в канал, принадлежащий клиенту? Нужно отправить событие в обработчик клиентского запроса.

1.получить клиентский запрос

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

3.Читать ответ этого узла

4. отправить ответ клиенту

все эти 4 шага можно выполнить в одной функции в boost.asio. Но netty не поддерживает step3, функция чтения является независимой, пользователь не может вызвать ее напрямую. Единственный способ - после получения ответа в обработчике между узлом управления и узлом, повторно отправить его обработчику между узлом управления и клиентом. Какой типичный способ сделать это?

1 Ответ

3 голосов
/ 23 ноября 2011

Netty использует асинхронные операции ввода-вывода, следовательно, шаг 2 является асинхронным, и да, вы не можете заблокировать, пока не получите шаг 3.

В большинстве подобных случаев (не только для Netty) вы можете сделать следующее:
1) предоставить уникальные идентификаторы для ваших запросов, узлы должны отражать уникальные идентификаторы в своих ответах.
2) Сохраните их в хэш-карте с ключом в качестве уникального идентификатора запроса и канала (между узлом управления и клиентом) в качестве его значения
3) Когда вы получаете ответ от узла в узле управления, вы можете найти канал из хэш-карты, используя уникальный идентификатор, а затем отправить ответ клиенту.

Вы также можете взглянуть на балансировщик нагрузки Netty Бруно де Карвалью , который даст вам еще один взгляд на ту же проблему. Он использует туннелирование для достижения того же эффекта.

...