Служебная структура Stateful service - масштабирование без разбиения?
Я планирую перенести существующую облачную монолитную службу Restful Web API в Service Fabric в три этапа. Кэш памяти (в процессе) интенсивно использовался в моем облачном сервисе.
Шаг 1) Миграция облачного сервиса на сервис SF Stateful с 1 репликой и одним разделом. Код кеша как есть. Не использовать надежную коллекцию.
Шаг 2) Горизонтальное масштабирование SF монолитной службы с сохранением состояния до 5 реплик и одного раздела. Код кэша изменен для использования надежной коллекции.
Шаг 3) Разбейте монолитный сервис SF на микро сервисы (без сохранения состояния / с сохранением состояния)
Является ли вышеуказанный подход чище? Любая рекомендация. Любой недостаток?
Подробнее на шаге 2) Горизонтальное масштабирование службы SF Stateful
- Я не планирую использовать стратегию секционирования SF, так как я не мог придумать равномерного распределения данных в моей заявке.
- Добавляя больше реплик и не разделяя их с сервисом SF Stateful, я просто делаю свой сервис более надежным (доступность) . Правильно ли мое понимание?
- Я изменю код кеша, чтобы использовать Надежную коллекцию - Словарь. Одинаковые данные о состоянии будут доступны во всех репликах.
- Я понимаю, что GET может выполняться на любой реплике, но обновление / запись нужно выполнять на первичной реплике?
- Как я могу масштабировать свою службу SF с сохранением состояния без разделения?
Могут ли все реплики, включая secondory, прослушивать мой клиентский запрос и отвечать одинаково? GET должен быть в состоянии выполнить, как работает вызов PUT & POST?
Должен ли я предпочесть использование внешнего хранилища кэша (Redis) над надежным сбором на этом этапе? Использовать сервис без сохранения состояния?
1 ответ
В этом документе представлен хороший обзор вариантов масштабирования определенной рабочей нагрузки в Service Fabric и несколько примеров того, когда вы хотите использовать каждый из них.
Вариант 2 (создание большего количества экземпляров службы, динамический или предварительный) звучит так, как будто он довольно хорошо соответствует вашей рабочей нагрузке. Решите ли вы использовать пользовательскую службу с сохранением состояния в качестве кэша или использовать внешнее хранилище, зависит от нескольких вещей:
- Есть ли у вас место на ваших основных вычислительных машинах для хранения кэшированных данных
- Может ли ваш сервис обойтись простым кешем или ему нужны более продвинутые функции, предоставляемые другими сервисами кеширования
- Нуждается ли ваша служба в повышении производительности кэша в том же наборе узлов, что и веб-уровень, или она может позволить вызывать удаленную службу с точки зрения задержки
- можете ли вы позволить себе платить за службу кэширования или хотите сделать это за счет использования памяти, вычислительных ресурсов и локального хранилища, за которые вы уже платите с помощью виртуальных машин.
- действительно ли вы хотите заняться созданием и запуском собственного кэша
Чтобы ответить на некоторые другие ваши вопросы:
- Да, добавление дополнительных реплик увеличивает доступность / надежность, а не масштаб. Фактически это может оказать негативное влияние на производительность (для записи), поскольку изменения должны быть записаны в большее количество реплик.
- Данные о состоянии не гарантируются одинаковыми во всех репликах, только в большинстве из них. Некоторые второстепенные могут быть даже впереди, поэтому чтение из вторичных не рекомендуется.
- Итак, к вашему следующему вопросу рекомендуется, чтобы все операции чтения и записи всегда выполнялись с первичными данными, чтобы вы могли видеть согласованные данные, принятые кворумом.