Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Кодер
50 / 49 / 7
Регистрация: 10.10.2010
Сообщений: 229
1

Обсуждение написания сервера

15.06.2012, 12:24. Показов 1157. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, недавно возник вопрос по написанию нагруженного сервера для одной клиентской программы.

Прошу выбрать вариант и обосновать его положительные качества (если хотите, предлагайте свои варианты, я не против ). Приоритет - скорость обслуживания клиента (ну, и конечно, меньшее количество падений сервера, хотя, это уже дело рук и времени).

Если это имеет значение, писать буду под Линукс, на с++, сервер будет работать с базами Oracle 11g.

Итак, варианты:

1. В мэйнстриме будет сам цикл с функцией accept. После установления соединения сервер начинает работать с клиентом в отдельном потоке (по одному потоку на каждого клиента). После окончания работы с клиентом поток либо уничтожается (закрывается), либо уходит во вторичное использование. Итог - количество потоков равно количеству подключенных в данное время клиентов.

P.S. Если бы меня не насторожило количество потоков (<50000), я скорее всего бы не стал создавать эту тему, и начал бы писать этим способом. Возникает вопрос: А есть ли ограничения на потоки? Не упадет ли система от такого количества потоков? А падение системы неприемлемо.

2. На каждую функцию(около 100) сделать по потоку с очередью(стеком). Как и в первом способе, accept будет в мэйнстриме. После установления соединения, клиент становится в очередь приема сообщений, и так далее, каждое сообщение обрабатывается в очереди. Я думаю, этот способ более надежный, однако кода здесь будет на много, а то и во много раз больше.

Обсуждайте.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2012, 12:24
Ответы с готовыми решениями:

Технология клиент-сервер. Классы клиента и сервера. Обсуждение
В данном теме выкладываю свои классы клиента и сервера, а так же простеньких примеров реализованных...

Что нужно знать для написания сервера
всем привет.решил попробовать сделать сервер на c++.раньше этим не занимался.подскажите хорошие...

Подскажите ЯП для написания игрового сервера и браузерного клиента
Здравствуйте. Есть цель написать клон одной известной ККИ (колекционной карточной игры). Нужен...

Что посоветуете использовать для написания многопоточного сервера?
Здравствуйте, хотел узнать какими библиотеками и технологиями надо пользоваться при написании...

2
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
15.06.2012, 14:06 2
Цитата Сообщение от n00b.vcxproj Посмотреть сообщение
Добрый день, недавно возник вопрос по написанию нагруженного сервера для одной клиентской программы.

Прошу выбрать вариант и обосновать его положительные качества (если хотите, предлагайте свои варианты, я не против ). Приоритет - скорость обслуживания клиента (ну, и конечно, меньшее количество падений сервера, хотя, это уже дело рук и времени).

Если это имеет значение, писать буду под Линукс, на с++, сервер будет работать с базами Oracle 11g.

Итак, варианты:

1. В мэйнстриме будет сам цикл с функцией accept. После установления соединения сервер начинает работать с клиентом в отдельном потоке (по одному потоку на каждого клиента). После окончания работы с клиентом поток либо уничтожается (закрывается), либо уходит во вторичное использование. Итог - количество потоков равно количеству подключенных в данное время клиентов.

P.S. Если бы меня не насторожило количество потоков (<50000), я скорее всего бы не стал создавать эту тему, и начал бы писать этим способом. Возникает вопрос: А есть ли ограничения на потоки? Не упадет ли система от такого количества потоков? А падение системы неприемлемо.

2. На каждую функцию(около 100) сделать по потоку с очередью(стеком). Как и в первом способе, accept будет в мэйнстриме. После установления соединения, клиент становится в очередь приема сообщений, и так далее, каждое сообщение обрабатывается в очереди. Я думаю, этот способ более надежный, однако кода здесь будет на много, а то и во много раз больше.

Обсуждайте.
Смотря каких потоков. Если это будут pthreads, то да, для такого количества производительность будет печальна. Плюс накладные расходы при их создании/удалении из-за переключения контекста, а также необходимость хранить информацию по каждому потоку.
Для высоконагруженных сервисов такая модель недопустима.

Вторая реализация будет сильно зависеть от ваших талантов — как напишете синхронизацию между потоками, как будете управлять количеством ядерных потоков и т.д.

Лично я бы не городил велосипеды и взял уже реализованную систему конкурентного программирования — тот же Erlang, например, в зависимости от задачи. Но если требование именно C++, то вам можно только посочувствовать.

Можете посмотреть в сторону библиотек, реализующих быстрые потоки в userspace, но с ними нужно быть очень аккуратным при блокирующих вызовах. Плюс, у таких библиотек могут быть проблемы с "реальной" многозадачностью — те же GNU Portable Threads не умеют использовать SMP, т.е. вам придется запускать несколько копий обработчика по количеству ядер и раздавать им здания вручную, а также контролировать нагруженность этих процессов, что опять же приведет к усложнению архитектуры и разрастанию кода.
1
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
15.06.2012, 23:56 3
Серьёзный проэкт. А реализация потока на сколько я понял делается через сокеты(?) Если так то, каждый поток организуется блокирующим сокетом в дочернем процессе (к примеру через fork) или все делается паралельно одним процессом не блокирующим? Мне кажется в любом случае первый вариант сильно чреват для такого колличества подключений. Даже сославшись на хорошее железо разве этот вариант не более уязвим скажем к DDOS атакам?
===
Если сроки не жмут и есть навыки достаточные для реализации 2-го варианта. Думаю, лучше он. И с точки зрения безопасности и устойчивость системы будет для такого колличества подключений.
0
15.06.2012, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2012, 23:56
Помогаю со студенческими работами здесь

Требуется программист С++ для написания плагинов к консоли сервера
Здравствуйте! Проекту игры на космическую тематику срочно требуется программист С++ для написания...

Обсуждение статьи "Совместная работа MS Access и сервера MySQL" (Сергей 1980)
Вы пропустили еще некую процедурку при связи таблиц по указанному полю(для обеспечения целостности...

Обсуждение видеокарт.
У меня видюха PALIT GTS 250 Green 1024 Mb 256bit,в комплекте шёл маленький шнур 2-х...

Обсуждение литературы
День добрый! Сам авопрос: В документе Общая концепция.doc - есть пункт по созданию Фреймсетов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru