В настоящее время мы работаем над нашим новым продуктом / проектом, это клиент-серверное приложение, предназначенное для определенных конкретных промышленных / сервисных предприятий. Мы создаем сервер (только на языке C и Linux), на котором выполняется настраиваемый протокол поверх TCP с внешним интерфейсом Java. Мы занимаемся программированием примерно на 20% и сталкиваемся с ситуацией, когда приходится выбирать между микро- или монолитной архитектурой ядра.
Я знаю, что Micro против Monolithic обычно имеет отношение к архитектуре ядра, но мы конкретно говорим о серверах.
Почему пользовательский сервер, а не что-то существующее?
- Наши потребности в пользовательском интерфейсе значительны и очень динамичны, поэтому решения на основе Web / Web-браузера не подходят.
- Статистическая обработка важна на стороне клиента, и поэтому, опять же, браузеры мало помогали. (Конечно, мы можем выполнить обработку на стороне сервера и передать обработанные данные клиенту, но это будет означать большую нагрузку на сервер и потерю ресурсов клиента).
- Более того, по крайней мере три технологии (JS / HTML / CSS) для управления даже одним событием превращают весь процесс в подобие уборки дома посреди пустынной бури - вы подметаете его n раз, а пыль накапливается n + 1 раз.
А как насчет микро и монолитного сервера? О чем ты говоришь?
Рассмотрим следующий (гипотетический) клиентский запрос:
request-id: 123
request-service: HistoricDataSets
request-message: Fetch all records upto the year 2010
Получив такой запрос, сервер, как правило, делает (мы игнорируем методы параллелизма, такие как поток и вилки для простоты):
- Разобрать строку запроса
- Определите действие (Fetch
HistoricDataSets LIMIT Year (2010)
в нашем случае) - Взаимодействуйте со слоем персистентности (например, Oracle, в нашем примере) и извлекайте данные.
Отформатируйте данные в соответствии с протоколом. Пример:
идентификатор ответа: 123
успех: верный
текст ответа: наборы данныхОтветьте клиенту с таким образом отформатированными данными.
Это то, что мы называем Монолитным Сервером (сродни монолитному ядру, где все операции ОС выполняются в пространстве ядра).
Рассмотрим тот же запрос еще раз при получении, на этот раз сервер (мы предположили, что в качестве IPC мы использовали только общую память, опять же для простоты):
- Помещает запрос в общую память для
Parser
процесса Parser
Разбирает строку, идентифицирует задачу и направляетExecutioner
процесс для выполнения этих задач.- Затем
Executioner
он передает данные дляFomatter
обработки, которые после форматирования данных в строку протокола возвращаются на сервер. - Сервер отправляет его клиенту (ответ).
Конечно, вместо Parser
, Executioner
и Formatter
это мог быть один, но отдельный процесс. Это то, что мы называем микро-сервером (сродни микроядру, выполняющему едва ли не минимум, что требуется). Сервер фактически только слушает и отвечает, тогда как все шаги выполняются разными процессами.
Какой выбрать? Мы в замешательстве! В то время как монолитные серверы проверены и протестированы (большинство HTTP-веб-серверов?), Их легче программировать, и они могут справиться с параллелизмом. Микро-серверы, prima facie, кажутся быстрыми и соответствуют принципу UNIX одной программы для выполнения одной задачи, но также сложны в разработке, особенно. имея в виду параллелизм.
Вопрос (ы)
- Каковы (возможно, могут быть) плюсы и минусы каждого подхода?
- Когда использовать что? (Это также можно интерпретировать как общий вопрос: когда использовать IPC?)
- Если выбрано ядро Micro, то какие функции должны быть частью core-server, а какие нет?
Похожие / похожие вопросы
- Опасности огромного монолитного применения
- Внешний против встроенного браузера (тангенциальный)
- Рекомендации по преобразованию монолитного приложения в многопоточное (Tangential)
Некоторая информация, которая может быть полезна:
- Наши потенциальные клиенты можно разделить на две категории:
- Большой: около 1700 - 2000 запросов в минуту
- Малый: около 650 - 700 запросов в минуту
- Можно предположить, что объем данных за цикл запроса (запрос и последующий ответ) обычно распределяется со средним значением ~ 1,20 МБ, а в худшем случае - около 250-300 МБ.
- Концепция продукта является относительно новой, но она способна влиять на основные операции, поэтому мы ожидаем, что бюджеты клиентов будут гибкими только после определенного отставания (9-12 месяцев) после развертывания, что ограничивает количество оборудования, которое клиент будет готов совершать esp. маленькие.
- У каждого клиента будет свой стек клиент-сервер. Сервер будет работать на оборудовании клиента, управляемом командой клиента, а клиенты будут развернуты на компьютерах функциональных сотрудников.
- Необходимо удаленное обновление как клиентского, так и серверного приложения.
PUSH
Услуги сервера в режиме реального времени могут быть «очень» желанными, если продукт нажмет!