Название: Быстродействие сервера Отправлено: sidsukana от Август 03, 2012, 08:13 Есть сервер (допустим некой игры). Соответственно есть опкоды, которым он обменивается с клиентами и их хендлеры. Этих опкодов может быть очень много (ну на разные игровые события) соответственно много хендлеров. Так вот есть такой вопрос - как правильно реализовать обработку хендлеров? Правильно ли будет при приеме очередного пакета с клиента, использовать сигнал-слот для передачи данных в хендлер? Или же по старинке использовать указатель на функцию хендлера? Вообще использование сигналов-слотов в реализации клиент-серверного пинг-понга это будет нормально, или же постепенно глобальный eventloop Qt будет переполняться и все пойдет под откос?))
И опять же, мы говорим про серверную сторону - клиентов может быть и 10 и 100 и 1000. Естественно будет необходима многопоточная реализация. Название: Re: Быстродействие сервера Отправлено: Bepec от Август 03, 2012, 08:16 Если нагрузка на сервер минимальна (100-300 соединений) то сигналы спокойно справятся.
Если нагрузка больше, то желательно обойтись без сигнал-слотов на каждый чих. У нас есть один интересный человек, alexis(тут много цифр). Он реализовал вроде сервер на С++. Можете спросить совета у него. Название: Re: Быстродействие сервера Отправлено: alexis031182 от Август 03, 2012, 10:29 Верес прав. Если нужен максимально быстрый отклик, то лучше без сигнал-слотов обойтись. Также, лучше не использовать QTcpServer. Он удобен и прост, но относительно медленный при большом количестве соединений. Для виндовса рекомендовать ничего не могу (попросту не работаю с этой ОС), а для Linux используйте epoll.
Название: Re: Быстродействие сервера Отправлено: sidsukana от Август 03, 2012, 10:36 QTcpServer он же просто принимает соединения, или я не прав? Вся работа же лежит на QTcpSocket(AbstractSocket)?
Название: Re: Быстродействие сервера Отправлено: Bepec от Август 03, 2012, 10:41 Там по идее всё на сигнал слотах, соответственно каждое соединение тормозит на всё большее время и так пропорционально нагрузке.
Название: Re: Быстродействие сервера Отправлено: sidsukana от Август 03, 2012, 10:48 Соединение же одноразовое. Черт, я забыл сказать что используются сессии.
Название: Re: Быстродействие сервера Отправлено: alexis031182 от Август 03, 2012, 10:59 QTcpServer он же просто принимает соединения, или я не прав? Вся работа же лежит на QTcpSocket(AbstractSocket)? Да, я имел в виду не использовать связку QTcpServer и QTcpSocket.Название: Re: Быстродействие сервера Отправлено: alexis031182 от Август 03, 2012, 11:04 Соединение же одноразовое. Черт, я забыл сказать что используются сессии. Если клиент - браузер, то как минимум одно соединение с каждого клиента остаётся подключенным. Если конечно сервер работает на HTTP/1.1 и "вручную" не отключает соединение после отправки данных клиенту. Если же клиент - не браузер, то имеет смысл рассмотреть вариант с неодноразовыми подключениями.Название: Re: Быстродействие сервера Отправлено: sidsukana от Август 03, 2012, 11:07 В общем сделать на Qt хорошо организованный сервер не выйдет, да?
Я просто к чему. Мне очень нравится фреймворк, и есть задача реализовать такой сервер средствами Qt. Т.е даже без гуи, просто использовать кросс-платформенные возможности Qt не как gui фреймворка. Название: Re: Быстродействие сервера Отправлено: alexis031182 от Август 03, 2012, 11:15 В общем сделать на Qt хорошо организованный сервер не выйдет, да? Выйдет, и довольно быстро сделаете, просто он будет работать медленно при большом количестве соединений.Я просто к чему. Мне очень нравится фреймворк, и есть задача реализовать такой сервер средствами Qt. Т.е даже без гуи, просто использовать кросс-платформенные возможности Qt не как gui фреймворка. Я тоже с этого начал, делал (и делаю) HTTP-сервер. Но потом пришлось отказаться от сетевой части Qt, т.к. скорость работы оставляла желать лучшего в сравнении с тем же nginx. Перешёл на epoll (Linux) - совсем другое дело стало. Так что Вы можете основную часть программы реализовать на Qt, а поддержку сети лучше делать другими средствами. |