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