Я розглядаю можливість перенесення монолітного API REST на архітектуру мікросервісу, і я трохи заплутався щодо зберігання даних. Як я бачу, деякими перевагами мікросервісів були б:
- Горизонтально масштабований - я можу запускати кілька зайвих копій мікросервісу, щоб впоратися з завантаженням та / або сервером, що йде вниз.
- Мало пов'язаний - я можу змінювати внутрішні реалізації мікросервісів, не змінюючи інших, і можу самостійно їх розгортати та змінювати тощо.
Моя проблема - зі зберіганням даних. Як я бачу, є кілька варіантів:
- Єдина послуга Бази даних, якою поділяються всі мікросервіси - це, здавалося б, повністю усуне будь-яку користь від втрати зв'язку.
- Місцевий екземпляр бази даних на кожній мікросервісі - я не бачу способу горизонтального масштабування цього, тому не думаю, що це було б варіантом.
- Кожна мікросервіс має власну службу баз даних - це здається найбільш перспективним, оскільки вона зберігає переваги нещільного з’єднання та горизонтального масштабування (використання надмірних копій бази даних та / або різкості в декількох)
Мені здається, що третій варіант є єдиним варіантом, але він здається мені неймовірно важким, і дуже переосмисленим рішенням. Якщо я правильно це розумію, то для простого додатка з 4-5 мікросервісами мені доведеться запустити 16-20 серверів - два фактичні екземпляри мікросервісу на одну мікросервіс (у разі відмови сервера та для розгортання без простоїв), і два екземпляри служби бази даних на мікросервіс (у разі відмови сервера тощо ...).
Це, відверто кажучи, здається трохи смішним. 16-20 серверів для запуску простого API, маючи на увазі, що реалістичний проект, ймовірно, матиме більше 4-5 послуг? Чи є якась фундаментальна концепція, яка мені не вистачає, що пояснить це?
Деякі речі, які можуть допомогти під час відповіді:
- Я єдиний розробник цього проекту, і буду в осяжному майбутньому.
- Я використовую Node.js та MongoDB, але мене зацікавили б мовно-агностичні відповіді - відповідь може бути навіть у тому, що я просто використовую неправильні технології!