Web server (boost.asio), Архитектура |
Здравствуйте, гость ( Вход | Регистрация )
Web server (boost.asio), Архитектура |
crashsp |
25.4.2012, 4:32
Сообщение
#1
|
Студент Группа: Участник Сообщений: 56 Регистрация: 23.10.2010 Пользователь №: 2144 Спасибо сказали: 8 раз(а) Репутация: 546 |
Доброго времени суток, сейчас есть написанный winsock сервер , но изначально не был продуман вопрос нагрузки , ну вот в сети у нас появилось более 2000 устройств которые ломятся на него с периодичностью 15 сек , как следствие возникли проблемы , в принципе увеличили таймером на 1 минуту стало полегче , но в любом случая рано или поздно и этого станет мало...А мне надо как минимум 5000 соединений обрабатывать с адекватными задержками, дальше уже думаю делать распределение по другим серверам.
Если честно не хочется больше ковырять этот MFC ' ишный проект, по коментам из разных источников решение моих проблем это boost.asio , прошу расскажите как должна выглядеть архитектура, возможно какие то свои наработки, может какая инфа на доступном языке, ну и вообще Ваше мнение. PS: Web Server потому что хочется за одно облегчить логику на стороне клиента. Благодарю. Сообщение отредактировал crashsp - 25.4.2012, 4:44 |
|
|
Алексей1153 |
25.4.2012, 6:10
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
crashsp, а в чём проблема то ? MFC прекрасно справляется с таким количеством соединений.
Протокол TCP/IP или UDP? Железо у сервера какое ? Как вариант - переписать на чистом SOCKET (вот совсем недавно реализовывал этот вариант): 1)поток с сервером 2)поток вычитки клиентов и отправки подтверждений протокола 3)поток отправки клиентам 4)поток обработки прочитанного Сообщение отредактировал Алексей1153 - 25.4.2012, 6:12 |
|
|
crashsp |
25.4.2012, 10:10
Сообщение
#3
|
Студент Группа: Участник Сообщений: 56 Регистрация: 23.10.2010 Пользователь №: 2144 Спасибо сказали: 8 раз(а) Репутация: 546 |
Протокол TCP/IP или UDP? TCP/IP Цитата Железо у сервера какое ? 4 cpu intel xeon , 2 GB RAM Цитата а в чём проблема то ? Вот текущая архитекрута : Создается 50 потоков , все запускаются и ждут события для чтения и записи CAsyncSocket принимает асинхронно соединения и складывает связанные с ними сокеты в std::queue<SOCKET*> , при определенном количестве сокетов в очереди ну скажем 3ех, помещаем их в свободные потоки и испускаем события по которому поток начнет читать данные, считал-> запись в лог -> работа с БД -> отправка результата обратно , как поток завершает операции с сокетом и обработкой пришедшей инфы он смотрит сразу в очередь что б взять следующий сокет и так далее . Этот вариант в принципе работает и сейчас нормально (1 минутный интервал еще не на всех устройствах) , не уверен что этот подход правилен и хочется пересмотреть архитектуру , вот и возникла идея сразу это еще и кросплатформенно решить. Как по вашему такая архитектура себя поведет при нагрузки в 5000 соединений ? может и этот вариант стоит модернизировать и успокоится ? пакеты в принципе маленькие , БД Oracle, так что в принципе задержек в этом месте нет . |
|
|
Алексей1153 |
25.4.2012, 10:45
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
железо сойдёт (хотя, лишних памяти, ядер и частоты не бывает )
архитектура не очень. 50 потоков - надеюсь, все разом не пытаются работать! Ты там наверняка ещё извещения используешь от сокетов ? Я без них обошёлся - так шустрее (цитата из описания выполненного задания) Цитата Приборы (клиенты) подключаются к серверу и присылают данные по протоколу TCP/IP. Программа читает данные и складирует в базу данных. Реализован конвеер из 4 потоков (каждый обрабатывает свой контейнер с данными, каждый контейнер используется по крайней мере двумя потоками): 1) поток "сервер" ->контейнер сокетов клиентов 2) поток "чтение"->контейнер сырых данных 3) поток "анализ"->контейнер данных для записи в БД 4) поток "запись в БД" – окончательный анализ данных и запись в БД если интересует, могу переделать эту штуку под ваши нужды (не бесплатно) |
|
|
crashsp |
25.4.2012, 11:20
Сообщение
#5
|
Студент Группа: Участник Сообщений: 56 Регистрация: 23.10.2010 Пользователь №: 2144 Спасибо сказали: 8 раз(а) Репутация: 546 |
Цитата 50 потоков - надеюсь, все разом не пытаются работать! Если в очереди 50 сокетов и есть свободных 50 потоков то каждый из них попадает в свой поток и начинается его обработка соответсвенно идет паралельная работа , помоему ради этого и плодили эти потоки , так что ситуация может быть и такая что все 50 потоков чего то мутят. Почему это плохо ? Цитата Ты там наверняка ещё извещения используешь от сокетов ? нет Цитата если интересует, могу переделать эту штуку под ваши нужды (не бесплатно) Не привык сдаваться |
|
|
Алексей1153 |
25.4.2012, 11:24
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
crashsp |
25.4.2012, 11:36
Сообщение
#7
|
Студент Группа: Участник Сообщений: 56 Регистрация: 23.10.2010 Пользователь №: 2144 Спасибо сказали: 8 раз(а) Репутация: 546 |
Цитата это я понимаю. То есть, время не жмёт, начальник не ругается ) Не , когда устроился была ситуация что сервак падал и не принемал временами соединения ,там вот начальник ругался , вся идея была перевернута , то есть прием соединения запускался внутри очередного потока , то есть принял соедиения получил сокет , испустил событие о том что айкепнул - > следующий свободный поток впал в accept и так далее,вобщем редкосный заморочь , я наворотил решение что выше ,тем самым временно решил проблемму, выйграл время для человеческого решения ))) и вот я здесь ). |
|
|
Алексей1153 |
25.4.2012, 11:42
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
я написал решение. Реально работает на живых приборах
|
|
|
Текстовая версия | Сейчас: 22.11.2024, 10:40 |