Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Архитектура Многопоточного сервера


Автор: DominiK 13.10.2008, 10:48
Есть задача написать многопоточный сервер, который будет работать с базой mysql, и держать одновременно нагрузки до 1-2к клиентов, (клиент спросил - сервер глянул в базу, вытянул данные - клиент получил), объемы данных не большие, реализацию данной задачи нужно делать под windows 2003 сервер. Суть темы - для примера хотел бы перелопатить пару исходников с одновременно не сложной и стабильной архитектурой подобного сервера, исходники\названия приложений, хочу спросить у гуру, те кто писал подобные вещи, откликнетесь. Своя реализация в голове рождается, но всё таки хочу опираться на какую то базу, чтобы не допускать ошибок лишних, вообщем хочу пример, может литературу посоветуйте почитать какую то, спасибо    smile 

Автор: Lazin 13.10.2008, 11:33
ИМХО, нужно создать пулл потоков, количество потоков должно зависеть от железа, а не от количества подключенных клиентов, например количество ядер*2, работать с клиентами асинхронно, перо БД ничего не скажу...
можно использовать boost::asio

Автор: DominiK 14.10.2008, 19:54
upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Thread_pool.svg/400px-Thread_pool.svg.png

Рассмотрел бы вот такую вот реализацию

Автор: MAKCim 15.10.2008, 09:02
DominiK, 
один поток - accept-ор
остальные N (как сказал Lazin, зависящие от параметров системы) - рабочие
есть матрица дескрипторов потоков N * M
accept-ор устанавливает соединения и связывает их с дескрипторами
у каждого рабочего потока свои M дескрипторов
резонно использовать пул соединений с БД для каждого такого потока, чтобы избежать синхронизации и макисмально распараллелить операции
работа потоков с дескрипторами будет зависеть от модели используемого I/O (самые производительные: неблокируемый и асинхронный)
я бы использовал модель асинхронного I/O

Автор: Lazin 15.10.2008, 09:15
Цитата(MAKCim @  15.10.2008,  09:02 Найти цитируемый пост)
есть матрица дескрипторов потоков N * M

Цитата(MAKCim @  15.10.2008,  09:02 Найти цитируемый пост)
у каждого рабочего потока свои M дескрипторов

это для того, что-бы данные от каждого соединения обрабатывались всегда одним и тем-же потоком, для того что-бы оптимально использовался кэш процессора, я правильно понял?

Автор: DominiK 16.10.2008, 13:45
Посоветуйте исходник где есть подобная реализация или нечто приближенное к этому, надо живой пример

Автор: MAKCim 17.10.2008, 09:13
Цитата(Lazin @  15.10.2008,  09:15 Найти цитируемый пост)
это для того, что-бы данные от каждого соединения обрабатывались всегда одним и тем-же потоком

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

Автор: DominiK 18.10.2008, 12:02
Цитата(MAKCim @ 17.10.2008,  09:13)
Цитата(Lazin @  15.10.2008,  09:15 Найти цитируемый пост)
это для того, что-бы данные от каждого соединения обрабатывались всегда одним и тем-же потоком

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

Макс, у тебя есть личные наработки по этой теме, которыми можешь поделиться? Мне надо 1 раз увидеть реальный пример, возможно выполняющий простые задачи, и на базе его уже можно отталкиваться в нужную сторону! smile 

Автор: Lazin 18.10.2008, 12:32
Тебе нужно использовать IO Completion Ports, в MSDN наверняка есть примеры использования, так-же можно использовать библиотеки, лично я использую для этого boost::asio, в документации хватает примеров, но это не единственный вариант smile

Добавлено через 3 минуты и 57 секунд
http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/examples.html

Автор: DominiK 18.10.2008, 14:51
Цитата(Lazin @ 18.10.2008,  12:32)
Тебе нужно использовать IO Completion Ports, в MSDN наверняка есть примеры использования, так-же можно использовать библиотеки, лично я использую для этого boost::asio, в документации хватает примеров, но это не единственный вариант smile

Добавлено @ 12:36
http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/examples.html

Дружище я бутс не осбо использовал, хотя это будет в повод в нём разобраться, но на это надо время, которого у меня не многоsmile

Автор: Олег2005 18.10.2008, 19:39
Кое что здесь есть

Автор: J0ker 20.10.2008, 01:48
Цитата(DominiK @  18.10.2008,  14:51 Найти цитируемый пост)
Дружище я бутс не осбо использовал, хотя это будет в повод в нём разобраться, но на это надо время, которого у меня не много

там не надо много времени
по дефолту под винду он юзает комплишен портс - что тебе и надо

Автор: Lazin 20.10.2008, 08:14
Цитата(DominiK @  18.10.2008,  14:51 Найти цитируемый пост)
Дружище я бутс не осбо использовал, хотя это будет в повод в нём разобраться, но на это надо время, которого у меня не много

как уже сказали, boost использует completion ports, и из буста, для использования asio нужно знать boost::date_time(если будешь использовать таймеры), boost::shared_ptr, boost::enable_shared_from_this, boost::bind и boost::function вот пожалуй и все smile 
причем boost::shared_ptr, boost::enable_shared_from_this можешь и не использовать, но они используются в exemple-ах

Автор: DominiK 20.10.2008, 09:42
Цитата(Lazin @ 20.10.2008,  08:14)
Цитата(DominiK @  18.10.2008,  14:51 Найти цитируемый пост)
Дружище я бутс не осбо использовал, хотя это будет в повод в нём разобраться, но на это надо время, которого у меня не много

как уже сказали, boost использует completion ports, и из буста, для использования asio нужно знать boost::date_time(если будешь использовать таймеры), boost::shared_ptr, boost::enable_shared_from_this, boost::bind и boost::function вот пожалуй и все smile 
причем boost::shared_ptr, boost::enable_shared_from_this можешь и не использовать, но они используются в exemple-ах

Как сговорились прям smile  Мне  2 моих знакомых тоже самое сказали, касательно бутса. Ок, начну с ним разбираться более детально smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)