Comprendre quand utiliser les services avec état et quand utiliser la persistance externe dans Azure Service Fabric

Je passe mes soirées à évaluer Azure Service Fabric en remplacement de notre stack WebApps / CloudServices actuelle, et je ne suis pas tout à fait sûr de savoir quand les acteurs / acteurs étatiques doivent être des acteurs sans état et état persistant externe (Azure SQL, Azure Storage et DocumentDB). Je sais que c’est un produit assez récent (au moins pour le grand public), donc il n’y a probablement pas encore beaucoup de bonnes pratiques à ce sujet, mais j’ai lu la plupart des documents mis à disposition par Microsoft sans trouver un document précis. répondez à cela.

Le problème que je rencontre actuellement est notre magasin d’événements; Certaines parties de nos applications sont basées sur la sélection d’événements et CQRS, et j’évalue comment déplacer ce magasin d’événements sur la plate-forme Service Fabric. Le magasin d’événements contiendra beaucoup de données de séries chronologiques, et comme il s’agit de notre seule source de vérité pour les données qui y sont conservées, il doit être cohérent, répliqué et stocké dans une forme de stockage durable.

Une des façons dont j’ai envisagé de le faire est avec l’acteur stateful “EventStream”; chaque instance d’un agrégat utilisant le sourçage d’événement stocke ses événements dans un stream isolé. Cela signifie que l’acteur avec état peut garder une trace de tous les événements pour son propre stream, et j’aurais répondu à mes exigences quant à la manière dont les données sont stockées (transactionnelles, répliquées et durables). Cependant, certains stream peuvent devenir très importants (des centaines de milliers, voire des millions, d’événements), et c’est là que je commence à être incertain. J’imagine que le fait d’avoir un acteur possédant une grande quantité d’état aura des répercussions sur les performances du système lorsque ces grands modèles de données doivent être sérialisés ou désérialisés à partir du disque.

Une autre option consiste à garder ces acteurs sans état, et à leur faire simplement lire leurs données à partir d’un stockage externe tel qu’Azure SQL – ou simplement utiliser des services sans état au lieu des acteurs.

Fondamentalement, quelle est la quantité d’état pour un acteur / service “trop” et vous devriez commencer à envisager d’autres méthodes de traitement de l’état?

En outre, cette section du modèle de conception de Service Fabric Actors: Certains documents anti-patterns me laissent un peu perplexe:

Traiter les acteurs Azure Service Fabric comme un système transactionnel. Azure Service Fabric Actors n’est pas un système à base de validation à deux phases offrant ACID. Si nous n’implémentons pas la persistance facultative et que la machine sur laquelle l’acteur s’exécute meurt, son état actuel ira avec. L’acteur arrivera très rapidement sur un autre nœud, mais à moins que nous ayons mis en œuvre la persistance du support, l’état sera parti. Cependant, vous pouvez obtenir un haut niveau de fiabilité et de cohérence entre optimisation des tentatives, filtrage des doublons et / ou conception idempotente.

Qu’est-ce que “si nous n’implémentons pas la persistance facultative” indique ici? J’avais l’impression que tant que votre transaction modifiant l’état réussissait, vos données étaient conservées dans un stockage durable et répliquées sur au moins un sous-ensemble des répliques. Ce paragraphe me permet de me demander s’il ya des situations où l’état au sein de mes acteurs / services sera perdu et si c’est quelque chose que je dois gérer moi-même. L’impression que j’ai tirée du modèle dynamic dans d’autres parties de la documentation semble contrecarrer cette affirmation.

Une option que vous avez est de garder «certains» de l’état dans l’acteur (disons ce qui pourrait être considéré comme des données à chaud qui doivent être rapidement disponibles) et tout stocker sur une infrastructure de stockage «traditionnelle» telle que SQL Azure , DocDB, …. Il est difficile d’avoir une règle générale à propos d’un trop grand nombre d’états locaux mais, peut-être, cela aide-t-il de penser à des données chaudes ou froides. Les acteurs fiables offrent également la possibilité de personnaliser le StateProvider afin que vous puissiez également envisager d’implémenter un StateProvider personnalisé (en implémentant IActorStateProvider) avec les stratégies spécifiques dont vous avez besoin pour être plus efficace avec les exigences en termes de quantité de données, de latence. , fiabilité et ainsi de suite (note: la documentation est encore très minime sur l’interface StateProvider mais nous pouvons publier un exemple de code si c’est quelque chose que vous souhaitez poursuivre).

À propos des anti-modèles: la note concerne davantage la mise en œuvre de transactions entre plusieurs acteurs. Acteurs fiables fournit une garantie complète sur la fiabilité des données dans les limites d’un acteur. En raison de la nature dissortingbuée et faiblement couplée du modèle d’acteur, la mise en œuvre de transactions impliquant plusieurs acteurs n’est pas une tâche anodine. Si les transactions «dissortingbuées» sont une exigence forte, le modèle de programmation des services fiables est probablement mieux adapté.

Je sais que cela a été répondu, mais récemment, je me suis retrouvé dans la même situation avec un système CQRS / ES et voici comment je l’ai fait:

  1. Chaque agrégat était un acteur avec uniquement l’état actuel stocké dans celui-ci.
  2. Sur une commande, l’agrégat affecterait un changement d’état et déclencherait un événement.
  3. Les événements eux-mêmes ont été stockés dans une DocDb.
  4. Lors de l’activation, les instances d’AggregateActor lisent les événements de DocDb s’ils sont disponibles pour recréer leur état. Ceci n’est évidemment effectué qu’une fois par activation d’acteur. Cela a permis de gérer le cas où une instance d’acteur est migrée d’un noeud à un autre.

Pour répondre à la question de Sedcondary de @ Trond qui est ” Qu’est-ce que”, si nous n’implémentons pas la persistance facultative “indiquer ici?”

Un acteur est toujours un service avec état et son état peut être configuré, en utilisant un atsortingbut de la classe acteur, pour opérer dans l’un des trois modes suivants:

  1. A persisté. L’état est répliqué sur toutes les instances de réplica et sur le disque. Cet état est maintenu même si toutes les répliques sont fermées.
  2. Volatil. L’état est répliqué sur toutes les instances de réplica, en mémoire uniquement. Cela signifie que tant qu’une instance de réplique est active, l’état est maintenu. Mais lorsque toutes les répliques sont fermées, l’état est perdu et ne peut plus être récupéré après leur redémarrage.
  3. Pas de persistance. L’état n’est pas répliqué sur d’autres instances de réplicas, ni sur le disque. Ceci fournit la protection la moins d’état.

Une discussion complète du sujet peut être trouvée dans la documentation de Microsoft.