Я проводил вечера, оценивая Azure Service Fabric в качестве замены нашего текущего стека WebApps/CloudServices и чувствую себя немного неуверенным в том, как решать, когда сервисы/актеры с состоянием должны быть субъектами с точки зрения состояния, и когда они должны быть безъядерных участников с внешним сохраняющимся состоянием (Azure SQL, Azure Storage и DocumentDB). Я знаю, что это довольно новый продукт (по крайней мере, для широкой публики), поэтому, вероятно, не так много передового опыта в отношении этого, но я прочитал большую часть documentation, предоставленный Microsoft, не нашедший для этого определенного ответа.
Текущая проблемная область, к которой я приближаюсь, - это наш магазин событий; части наших приложений основаны на поиске событий и CQRS, и я оцениваю, как перенести это хранилище событий на платформу Service Fabric. Хранилище событий будет содержать много временных рядов данных, и поскольку это наш единственный источник истины для сохраняемых там данных, он должен быть последовательным, реплицироваться и храниться в какой-то форме длительного хранения.
Один из способов, который я рассматривал, заключается в том, что он имеет статус "EventStream". каждый экземпляр агрегата с использованием источника событий хранит его события в изолированном потоке. Это означает, что актер, занимающийся состоянием, может отслеживать все события для собственного потока, и я бы выполнил мои требования относительно того, как данные хранятся (транзакционные, реплицированные и долговечные). Тем не менее, некоторые потоки могут расти очень большими (сотни тысяч, если не миллионы) событий, и именно здесь я начинаю сомневаться. Я думаю, что наличие актера с большим количеством состояний повлияет на производительность системы, когда эти большие модели данных должны быть сериализованы или десериализованы с диска.
Другой вариант заключается в том, чтобы держать этих участников без гражданства и заставить их просто читать свои данные из какого-либо внешнего хранилища, такого как Azure SQL, или просто использовать службы без терпимости вместо участников.
В принципе, когда количество состояний для актера/услуги "слишком много", и вы должны начать рассмотрение других способов обработки состояния?
Кроме того, этот раздел в Дизайнере шаблонов услуг Fabric Actors: некоторые анти-шаблоны оставляют меня немного озадаченным:
Относитесь к роликам Azure Service Fabric как к транзакционной системе. Azure Service Fabric Actors не является двухфазной системой фиксации, предлагающей ACID. Если мы не реализуем необязательное постоянство, и машина, на которой работает актер, умирает, текущее состояние будет идти с ней. Актер будет продвигаться на другом node очень быстро, но, если мы не выполним упорство поддержки, состояние исчезнет. Тем не менее, между попытками повторного использования, дублированием фильтрации и/или идемпотентной конструкцией вы можете достичь высокого уровня надежности и согласованности.
Что означает "если мы не реализуем необязательное упорство" здесь? У меня создалось впечатление, что до тех пор, пока ваша транзакция, модифицирующая состояние, преуспела, ваши данные сохранялись в надежном хранилище и реплицировались, по крайней мере, в подмножество реплик. Этот абзац оставляет меня в недоумении, есть ли ситуации, когда состояние моих актеров/служб будет потеряно, и если это то, что мне нужно для себя. Впечатление, которое я получил от модели состояния в других частях документации, похоже, противодействует этому утверждению.