2015-04-11 6 views
0

Я пишу систему обмена сообщениями, используя Netty. Я не могу отправить последующее сообщение до того, как первое сообщение будет отправлено успешно (и время от времени ждут ответа отправки от конечной точки-партнера). Я вижу рекомендации не ждать, когда будущее будет завершено в ChannelHandlerAdapter, так как оно разжевывает циклы процессора в EventLoop.Netty - последовательная логика приложения и как избежать переключения контекста?

Вопрос в том, как достичь этой последовательной логики, не дожидаясь завершения первой отправки в ChannelHandlerAdapter EventLoop или избежать переключения контекста потока между потоком приложения и потоком eventloop?

a) Если я дождался завершения ChannelFuture в ChannelHandlerAdapter, он переваривает циклы процессора. Если я отправляю последующие сообщения в прослушивателе, зарегистрированном в канале Future для записи, используя логику приложения в прослушивателе, зарегистрированном в ChanelFuture этого канала, это также будет переваривать циклы процессора в EventLoop.

или

б) Если я использовать канал в потоке приложения и записи на этот канал, имеется резьба переключение контекста из ниток Application к нити канала. Есть ли способ избежать этого переключателя контекста потока в этом прецеденте?

Есть ли лучший способ?

ответ

0

В идеале вы можете делать все, не выходя из потока ввода-вывода вообще, если ваше приложение полностью асинхронное.

Это обычно требует:

  • вы знакомы с работы с фьючерсами. Асинхронная операция обычно возвращает будущее или требует обратного вызова в качестве параметра. Вам нужно будет добавить слушателя в будущее или указать правильную реализацию обратного вызова, чтобы выполняемое вами действие выполнялось, когда запрошенная асинхронная операция завершается. При правильном кодировании вам не нужно будет звонить future.await() или аналогичные блокирующие вызовы в будущем.
  • библиотеки, которые вы используете, являются асинхронными.
+0

В системе обмена сообщениями при отправке сообщений отправитель не может отправлять последующие сообщения, если только он не уверен, что сообщение приземлилось в удаленной очереди сообщений. И если это так, то он может отправлять только последующее сообщение в будущем обратном вызове. И это по сути означает, что я должен заблокировать отправку первого сообщения на удаленную конечную точку. Это нарушает цель регистрации слушателя. Мне не нужно регистрировать будущего слушателя. Вместо этого я просто блокирую будущую работу. – Sunny

+0

И если рекомендация не должна блокироваться в цикле событий, это можно сделать в потоке приложения. Но это будет означать дополнительный контекстный переключатель. Этот дополнительный контекстный переключатель может быть неприемлемым для приложений, чувствительных к задержкам. – Sunny

+0

Вышеупомянутый сценарий, который я упомянул для клиентов. На стороне сервера мы используем прослушиватели фьючерсов для любого блокирующего ввода-вывода, поскольку сервер обслуживает множество клиентов, и мы не хотим удерживать поток заложников (даже потоки цикла без событий). Клиенты по-прежнему блокируются по выдающемуся сообщению, пока будущие слушатели на серверах не ответят назад и не разблокируют клиентов. – Sunny