Я планирую написать сервер 'комет' для потоковой передачи данных клиентам.В прошлом я усовершенствовал один, чтобы использовать преимущества многоядерных процессоров, но теперь я начинаю с нуля.Я планирую использовать epoll / kqueue или libevent для питания сервера.
Одна из проблем, над которыми я работал, - какой дизайн сервера использовать?У меня есть несколько доступных вариантов, так как я планирую использовать многопроцессорную модель, чтобы использовать преимущества всех ядер ЦП.
- Предварительно разветвленный многопроцессорный процесс - каждый процесс выполняет самостоятельно, принимает
- Предварительно разветвленный многопроцессный процесс с мастером - главный процесс принимает, а затем использует передачу дескриптора для передачи принятого сокета процессу
- Предварительно разветвленный многопроцессный процесс с разными портами - каждый процесс прослушивает разныепорт в той же системе.Балансировщик нагрузки решает, какой процесс получит следующее соединение, основываясь на некоторой обратной связи по нагрузке от отдельных процессов демона.
Конструкция №2 наиболее сложна.Конструкция №3 проста, но включает в себя дополнительное оборудование, которое мне понадобится независимо от конструкции, поскольку оно будет работать на нескольких машинах и в любом случае потребует балансировщик нагрузки.Проект № 1 имеет проблему с громоподобным стадом, но я думаю, что с 8 процессами громоздкое стадо не имеет большого значения, но становится серьезным, когда клиенты постоянно подключаются и отключаются (что должно быть редко, поскольку это комет-сервер).
На мой взгляд, # 2 сложен и требует 2 дополнительных системных вызовов из-за передачи дескриптора между процессами master и slave для каждого accept.Лучше ли иметь эти накладные расходы против проблемы грома в стаде?Если у меня будет 8 процессов, которые проснутся и выполнят принятие, я потенциально смогу увидеть 8 приемов, если я использую Design # 1?
Каковы плюсы и минусы моего выбора дизайна?Что бы вы порекомендовали?