| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Архитектура Многопоточного сервера |
| Автор: DominiK 13.10.2008, 10:48 |
| Есть задача написать многопоточный сервер, который будет работать с базой mysql, и держать одновременно нагрузки до 1-2к клиентов, (клиент спросил - сервер глянул в базу, вытянул данные - клиент получил), объемы данных не большие, реализацию данной задачи нужно делать под windows 2003 сервер. Суть темы - для примера хотел бы перелопатить пару исходников с одновременно не сложной и стабильной архитектурой подобного сервера, исходники\названия приложений, хочу спросить у гуру, те кто писал подобные вещи, откликнетесь. Своя реализация в голове рождается, но всё таки хочу опираться на какую то базу, чтобы не допускать ошибок лишних, вообщем хочу пример, может литературу посоветуйте почитать какую то, спасибо |
| Автор: 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 |
это для того, что-бы данные от каждого соединения обрабатывались всегда одним и тем-же потоком, для того что-бы оптимально использовался кэш процессора, я правильно понял? |
| Автор: DominiK 16.10.2008, 13:45 |
| Посоветуйте исходник где есть подобная реализация или нечто приближенное к этому, надо живой пример |
| Автор: DominiK 18.10.2008, 12:02 | ||||
Макс, у тебя есть личные наработки по этой теме, которыми можешь поделиться? Мне надо 1 раз увидеть реальный пример, возможно выполняющий простые задачи, и на базе его уже можно отталкиваться в нужную сторону! |
| Автор: Lazin 18.10.2008, 12:32 |
| Тебе нужно использовать IO Completion Ports, в MSDN наверняка есть примеры использования, так-же можно использовать библиотеки, лично я использую для этого boost::asio, в документации хватает примеров, но это не единственный вариант Добавлено через 3 минуты и 57 секунд http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/examples.html |
| Автор: DominiK 18.10.2008, 14:51 | ||
Дружище я бутс не осбо использовал, хотя это будет в повод в нём разобраться, но на это надо время, которого у меня не много |
| Автор: Олег2005 18.10.2008, 19:39 |
| Кое что здесь есть |
| Автор: J0ker 20.10.2008, 01:48 | ||
там не надо много времени по дефолту под винду он юзает комплишен портс - что тебе и надо |
| Автор: Lazin 20.10.2008, 08:14 | ||
как уже сказали, boost использует completion ports, и из буста, для использования asio нужно знать boost::date_time(если будешь использовать таймеры), boost::shared_ptr, boost::enable_shared_from_this, boost::bind и boost::function вот пожалуй и все причем boost::shared_ptr, boost::enable_shared_from_this можешь и не использовать, но они используются в exemple-ах |
| Автор: DominiK 20.10.2008, 09:42 | ||||
Как сговорились прям |