Обработка подключений Netty во время сценария кратковременного сообщения

мы используем Netty3.2.1 в нашей игровой компании для управления соединением между клиентом и сервером. Наша цель - улучшить

  1. Способен обрабатывать такие сценарии, как сбои в сети, и должен иметь возможность восстанавливаться после этого как можно скорее.
  2. Увеличьте количество подключений, которые может обрабатывать один сервер, без отключения существующих подключенных сокетов.

Сценарий кратковременных сообщений В среде реального времени существует вероятность сбоев из-за сбоя поставщика услуг Интернета, поэтому все существующие клиентские (наши клиенты запускают повторное подключение после разрыва существующих подключений) соединения будут прерваны и повторно подключатся одновременно. Например, если сервер подключен к 25000 клиентам, все 25000 клиентов пытаются подключиться к серверу одновременно во время сообщения, что оказывает огромное давление на сервер. Поскольку в более старых версиях Netty не предусмотрена функция включения / отключения OP_ACCEPT, мы начали регулировать соединения сверх лимита в 100 одновременных подключений ssl-рукопожатий. Мы приостанавливаем поток босса на секунду, когда предел превышен. Мы еще не готовы использовать бета-версию Netty 4.0, которая предоставляет эту функцию.

Другой сценарий, который мы наблюдали во время нашего стресс-тестирования, заключался в том, что если на сервере огромное количество входящих подключений, требуется много времени для принятия всех входящих подключений и стабилизации (около 30 минут для 25 тысяч подключений, все 25 тысяч пытаются подключиться. в то же время) . Но если мы увеличим нагрузку медленно, netty сможет легко принимать все соединения за очень короткое время (около 3-5 минут). Мы хотим построить систему таким образом, чтобы она была устойчивой для обработки сценариев с ошибками.

  • Я добавил несколько журналов в существующий Netty Jar, и похоже, что метод read () не работает, когда клиенты отключаются во время огромной нагрузки.
  • Использование Netty3.6 Final jar, не сильно помогло
  • Поможет ли использование обработчика выполнения?
  • Отключение регулирования привело к исключению OOM на сервере.

Пожалуйста, предложите любые возможные подходы к решению этой проблемы. Есть ли другие способы дросселировать соединения?

сведения о настройке и конфигурации

Клиенты - инфраструктура JMeter - загрузка машин 2 ГБ - 50000 клиентов, количество сообщений в секунду - 12000 сообщений в секунду. Сообщение приветствует клиента и разделяет приветствие в виде строк. ulimit на всех машинах - 1,00,000

Сервер - 12 основных, HT и 48 ГБ рабочих потоков RAM - 50 (в два раза больше ядер с HT, и количество ядер становится 24). Все внутренние буферы TCP на Linux-машинах настроены для работы с пиковыми нагрузками. пределы.

У нашего обработчика конвейера есть следующие обработчики

  • pipeline.addLast (sslHadler) - Встроенный обработчик Netty
  • pipeline.addLast (messageEncoder) - просто кодирует и декодирует байты и преобразует их по мере необходимости в кадры сообщения.
  • pipeline.addLast (messageDecoder)
  • pipeline.addLast (Businesshandler)

person codeninja    schedule 02.04.2013    source источник


Ответы (1)


Я думаю, что здесь мало что можно сделать с netty 3.x, кроме того, возможно, установите небольшое количество невыполненных заданий, чтобы клиенту нужно было повторно подключиться позже.

Поэтому я думаю, что лучше всего перейти на Netty 4, когда это возможно. Извините....

person Norman Maurer    schedule 02.04.2013
comment
Привет, Норман, большое спасибо за ответ. И последнее: во время этого сценария мы видим, что существующие сокеты также закрываются. Место, где это происходит, находится в методе Nioworker.java read () {if (ret ‹0 || failure) {close (channel, successededFuture (channel)); return false;}} Пожалуйста, дайте мне знать, почему возникает такая ситуация. Здесь значение ret равно 0, а код, определяющий значение ret, выглядит как {while ((ret = ch.read (bb)) ›0) {readBytes + = ret; if (! bb.hasRemaining ()) {break;}}} почему это происходит? Есть ли ошибка в версии 3.2.1? - person codeninja; 05.04.2013