Gestione / Progettazione degli attori e del loro stato in Servizio di assistenza di Azure

1

Dopo alcune considerazioni ho finito col constatare che Service Fabric Actors è probabilmente il modo migliore per iniziare. Ora, mi chiedo se mi sto avvicinando a questo nel modo giusto.

La struttura

Di seguito, è la struttura che mi è venuta in mente.

Riepilogo

Ho un servizio stateless (DeviceCalculatorManager) che è responsabile della mappatura degli eventi ricevuti al servizio Actor corretto (DeviceCalculatorActor). Quindi, le operazioni di scrittura sono gestite da un diverso attore, DeviceWriterActor, che si occupa delle operazioni di scrittura nel database SQL, nelle code o in qualsiasi altra operazione di scrittura più intensiva.

Domande

  1. Supponendo che ogni attore sia indipendente dagli altri attori, è necessario eseguire transazioni su StateManager? Non penso perché è sempre garantito che 1 attore abbia solo 1 thread in esecuzione o mi manchi qualcosa qui? I metodi Async non rilasciano il blocco del Thread, è corretto?

  2. Volevo utilizzare una sorta di coda ordinata per archiviare gli eventi in sospeso da elaborare per ogni servizio stateful. Come il DeviceCalculatorActor riceve gli eventi da DeviceCalculatorManager e li archivia in una coda prima che inizi l'elaborazione. Qual è il modo migliore per implementarlo? Penso che questo sia importante nei casi in cui i Servizi vogliono arrestare ed elaborare gli eventi in una data successiva.

Nota : DeviceCalculatorManager è un servizio stateless perché non sto memorizzando alcuna informazione pertinente sugli attori utilizzati. Poiché Service Fabric mantiene la propria tabella di attore per la gestione. Se vedi che dovrei avvicinarmi a questo servizio in modo diverso, immagino che questo sia la terza domanda.

Grazie in anticipo.

    
posta deeproute 19.09.2017 - 20:29
fonte

1 risposta

0

Ci sono molti approcci che puoi prendere a seconda del problema che stai cercando di risolvere. Non ho capito bene la motivazione alla base di avere un attore di scrittura separato e un attore di calcolatrice. La cosa importante da tenere a mente è che ogni attore è a turni. Se si desidera delegare la responsabilità di salvare lo stato dell'Actor in un sistema di terze parti, questo è OK ma non è necessario. Potresti semplicemente scrivere su un servizio Stateful. Questo servizio può essere interrogato direttamente utilizzando un'API REST di terze parti, ecc. Se necessario.

Si noti che gli attori già gestiscono il loro stato e conservano già 3 copie (configurabili).

Se ritieni di voler mantenere questo stato su un supporto durevole (ad esempio SQL Server, Azure Table Storage o Redis), puoi eseguire il backup dello stato a intervalli regolari.

È piuttosto difficile dire esattamente la motivazione alla base della tua soluzione, ma ho un esempio che ho implementato (usando Akka) che ora sto trasferendo su Service Fabric a causa del sovraccarico che elimina.

  1. Ho un attore carrello acquisti che può tenere in memoria il carrello di un utente, ottimo perché posso ridimensionarlo all'infinito e il suo stato viene replicato.

In Akka, stavo usando Akka Persistence su MongoDB, ma questo è accompagnato da overhead delle prestazioni di riavvio, ripristino dello stato, gestione di istantanee, ecc. Con Service Fabric, questo overhead va via. Semplicemente non devi preoccuparti dello Stato (entro limiti ragionevoli se non lo corrompi, cioè usa sempre token di cancellazione).

  1. Questo attore carrello acquisti controlla l'inventario quando qualcuno vuole acquistare un prodotto (con Akka, stavo verificando l'inventario della memoria persistente nell'archivio mongo).

  2. Ora in Service Fabric, l'attore del mio carrello acquisti chiama un Inventory Actor per un determinato prodotto che sto acquistando per verificare se l'inventario è disponibile.

  3. Questo Inventory Actor chiama internamente un servizio stateful che mantiene un dizionario affidabile di inventario. Posso aggiornare facilmente l'inventario senza problemi di threading.

  4. A un certo punto, vorrei ottenere il riepilogo dell'inventario di un prodotto (ad esempio quanti in magazzino, quanti venduti ecc.). Per semplificare, aggiorno anche questo Inventario in Redis (non sono sicuro che sia necessario, ma dato che Redis è estremamente veloce, penso che ci potrebbero essere benefici nel mantenere una copia dell'inventario per letture veloci). Tutte le scritture avvengono utilizzando l'Inventory Actor, che a sua volta chiama il servizio Stateful.

Il più grande vantaggio di avere un attore di inventario è che sarà sempre basato su turni. Potrei aver memorizzato l'inventario direttamente nello stato di Inventory Actor, ma ho scelto contro di esso perché potrei voler eventualmente aprire l'inventario per le letture su sistemi diversi.

I servizi di stato ti permettono di farlo. Le letture di inventario basate su turni non avrebbero funzionato molto bene perché stai praticamente aspettando il tuo turno solo per leggere il riepilogo dell'inventario, quindi delegarlo a un servizio Stateful (e Redis) aiuta.

Spero che questo ti dia una certa direzione. Usando questa architettura in Akka sono stato in grado di scalare in modo significativo più che mai immaginato. Con Service Fabric, questo diventerà ancora più semplice in quanto non dovrò preoccuparmi di Gestione cluster, Posizione attore (chiavi di partizione semplice), gestione dello stato ecc.

Speriamo che questo ti fornisca alcune informazioni.

    
risposta data 19.09.2017 - 20:55
fonte

Leggi altre domande sui tag