Как лучше всего обрабатывать входящие сообщения? - PullRequest
8 голосов
/ 27 января 2012

Я пишу сервер для онлайн-игры, который в итоге сможет обслуживать 1000-2000 клиентов.В основном я нашел 3 способа сделать это:

  1. 1 поток / соединение (блокирование)
  2. Создание списка клиентов и циклический просмотр их (неблокирование)
  3. Выберите (в основном оператор блокировки для всех клиентов одновременно с необязательным временем ожидания?)

В прошлом я использовал 1, но, как мы все знаем, он плохо масштабируется,2 - это нормально, но у меня смешанные чувства по поводу того, что один клиент технически способен заставить всех остальных заморозить.3 звучит интересно (немного лучше, чем 2), но я слышал, что это не подходит для слишком большого количества соединений.Итак, что будет лучшим способом сделать это (в D)?Есть ли другие варианты?

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Обычный подход ближе всего к 3: асинхронное программирование с более высокопроизводительной альтернативой select, такой как системные вызовы poll или epoll в Linux, IOCP в Windows или библиотеки более высокого уровня, оборачивающие их. D не поддерживает их напрямую, но вы можете найти привязки D или сторонние библиотеки D (например, Tango), обеспечивающие их поддержку.

Высокопроизводительные серверы (например, nginx) используют один поток / процесс на ядро ​​ЦП и используют асинхронную обработку событий в этом потоке / процессе.

1 голос
/ 27 января 2012

Один из вариантов, который следует рассмотреть, - это иметь один поток, который запускает select / pole / epoll, но не обрабатывает результаты. Скорее он ставит в очередь соединения, о которых известно, что они имеют результаты, и позволяет пулу потоков получать данные. Если проверка того, что полный запрос считан, является дешевой, вы можете сделать это в потоке опроса с неблокирующим вводом-выводом и поставить в очередь только полные запросы.

Я не знаю, предоставляет ли D какую-либо поддержку для этого, кроме (возможно) межпотокового взаимодействия и организации очередей.

...