2016-03-02 5 views
0

У меня есть кусок кода, который проверяет, если ChannelHandlerContext WriteandFlush успешно (чтобы обеспечить сообщение было успешно отправлено перед отправкой следующего сообщения)Нетти ChannelFuture производительность

logger.debug("Writing '" + message + "' to channel now"); 
    ctx.writeAndFlush(message.getMessage()); 

    ChannelFutureListener cfl = new ChannelFutureListener() { 
     @Override 
     public void operationComplete(ChannelFuture future) throws Exception { 
     if (future.isSuccess()) { 
      // Message was successfully sent 
      logger.debug("Message '" + message + "' sent successfully"); 

У меня проблема является operationComplete является заняв чуть больше секунды после записи иflush, и это убивает производительность моего сервера. Кто-нибудь знает, почему это так долго?

Лучше всего проверять успех writeandflush таким образом, прежде чем продолжить?

ответ

1

Лучший способ обработки сообщений в системе async - это просто отправить их. Netty будет заботиться о сообщениях и заставить их поступать в надлежащем порядке.

Причина, по которой требуется так много времени до вызова ChannelFutureListener, заключается в том, что Netty будет называть ее только тогда, когда запись + флеш полностью преуспела. Когда это происходит, происходит следующее:

  1. Вы называете writeAndFlush
  2. Нетти записывает его в основной трубопровод (быстрый)
  3. Нетти промывает весь трубопровод (быстрый)
  4. Flush возвращение успеха, если данные прибыли на другой конечной точке, это может занять некоторое время
  5. Тогда слушатель называется

в advantag e этого метода состоит в том, что вы знаете, что другая сторона полностью получила данные в момент вызова слушателя и что его безопасные методы вызова близки в этот момент.

Если вы хотите отправить несколько пакетов в том же соединении, вместо вызова повторил writeAndFlush, вместо этого вы должны вызвать write для каждого пакета, а затем отправить flush() вызов после последнего пакета, таким образом, все pckets будут обрабатываться одновременно ,

Смежные вопросы