Russian Qt Forum
Ноябрь 24, 2024, 02:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Принципы построения многопоточного сервера  (Прочитано 3634 раз)
Urvin
Гость
« : Февраль 13, 2012, 15:13 »

Здравствуйте!

Подскажите, пожалуйста, как стоит реализовать оптимальный многопоточный сервер?

- Сервер будет держать около 50 клиентов постоянно подключенными;
- Общение происходит текстовыми строками в xml-подобном варианте. В основном по принципу запрос-ответ, но также сервер может рассылать команды самостоятельно, в т.ч. по запросу одного из клиентов;
- Необходима графическая среда для отслеживания ошибок и управления подключениями;
- В основном, в сервере сосредоточена несложная логика системы, но много SQL-запросов.

На примере fortune server и своих домыслов я бы сделал так:
1. Основной поток - для UI
2. В дополнительном потоке вертится постоянно слушающий порт QTcpServer и диспетчер подключений
3. Как только создается новое подключение, создается новый поток и новый сокет перенаправляется туда.
4. В потоке, обслуживающем сокет создается отдельное подключение к базе данных

Читая различные материалы, я понял, что это достаточное избыточное решение, слишком много потоков.
Как сделать правильно? Какова общая архитектура сервера?
Записан
andrew.k
Гость
« Ответ #1 : Февраль 13, 2012, 15:17 »

для 50 клиентов наверное по фигу как реализовывать.
А так на форуме уже много раз поднималась подобная тема. Правда все разбросано по темам.
Записан
Urvin
Гость
« Ответ #2 : Февраль 13, 2012, 15:23 »

Именно что все разбросано.
Не выходит в голове построить оптимальную модель.
Да, 50 клиентов - не так и много, но хочется же сделать правильно.
Записан
andrew.k
Гость
« Ответ #3 : Февраль 13, 2012, 15:27 »

Именно что все разбросано.
Не выходит в голове построить оптимальную модель.
Да, 50 клиентов - не так и много, но хочется же сделать правильно.
В целом идеология поток на соединение избыточна.
Поэтому один поток должен обслуживать некоторое количество соединений (пул соединений).
А какое количество соединений оптимально на один поток мне неизвестно)
Видимо нужно делать это параметром и смотреть как себя ведет сервер в нагрузке.
Записан
merke
Гость
« Ответ #4 : Февраль 13, 2012, 15:32 »

Ну так и создавай один поток коммуникатор, который занимается обслуживанием клиентов, а второй обработчик, который и занимается рутинной работой - обработка информации, получил что то, поставил в очередь, отдал потоку обработчика, принимаешь другие запросы, как только поток обработчик что то выполнил он передает потоку коммуникатору результат.
Записан
merke
Гость
« Ответ #5 : Февраль 13, 2012, 15:37 »

Просто видишь, сколько потоков не мути, количество процессоров у тебя не увеличится) а количество оперативной памяти на их обслуживание увеличится. Так что смысла в 100500 потоках не вижу, тут достаточно 3-х: главный - уи, 2-й коммуникатор, 3-й обработчик. И будет счастье, для синхронизации работы, или использовать стандартные средства для реализации очередей, либо писать свой класс очереди, под свои нужды(специфические форматы данных).
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Февраль 14, 2012, 15:35 »

Есть смысл использовать плавающий пул потоков
Записан
merke
Гость
« Ответ #7 : Февраль 14, 2012, 15:39 »

Есть смысл использовать плавающий пул потоков

можно поподробнее об этом?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.