Argomento precedente: Case study 12: utilizzo della logica di contatore per calcolare il numero di errori

Argomento successivo: Case study 14: gestione clock di controllo del tempo

Case study 13: gestione del gruppo di componenti dinamico

Spesso è necessario archiviare i valori di un gruppo di risorse i cui membri possono essere dinamici e modificarsi durante il periodo di calcolo. Nel seguente calcolo di esempio dei requisiti, è necessario eseguire un calcolo intermedio su ogni risorsa per raggiungere il risultato finale di aggregazione.

Di seguito vengono riportati alcuni esempi di questo tipo:

Esempio:

Per il seguente requisito di calcolo:

Calcolare la percentuale di disponibilità per un sistema che è composto da un cluster di server. Il sistema viene considerato disponibile solo quando tutti i server di base sono disponibili.

La progettazione della soluzione viene implementata come indicato di seguito:

Viene valutata la disponibilità del sistema tramite la disponibilità delle relative risorse di gruppo di base. In questo caso, è necessario gestire e archiviare lo stato di tutte le risorse di gruppo per valutare lo stato del sistema in ogni punto nel tempo.

Per eseguire questa operazione, la formula deve disporre di una mappa (la mappa ServerAvailabilityIndicators nel codice di esempio riportato di seguito) che presenta una voce per ogni risorsa monitorata. Poiché tutti gli oggetti di mappa richiedono un campo chiave per fare riferimento al valore associato, questa mappa avrà l'indicatore di risorsa come campo chiave (che è l'ID risorsa) e il valore sarà lo stato del componente. Quando lo stato di un componente cambia, è necessario modificare la voce corrispondente nella mappa. In seguito a ogni evento di disponibilità, la formula aggiornerà lo stato della relativa risorsa nella mappa ed eseguirà una nuova valutazione dello stato del sistema di conseguenza.

Poiché le risorse monitorate possono cambiare (alcune potrebbero essere rimosse e altre aggiunte durante il periodo di calcolo), è necessario gestire le modifiche all'interno della formula con l'aggiunta di una funzione che identifica la modifica e aggiorna la mappa del componente monitorato con l'aggiunta di una nuova voce per il nuovo componente o con l'eliminazione di una voce se un componente è stato rimosso.

OnRegistration è il gestore eventi che gestisce un evento di registrazione attivato quando si verifica una modifica nelle risorse monitorate. Tale modifica può verificarsi in seguito alla conferma di una risorsa (o un gruppo di modifiche) che potrebbe apportare modifiche alle risorse incluse nel calcolo, in base al metodo di registrazione della formula.

Durante ciascuna registrazione è necessario aggiornare la mappa che contiene gli stati della risorsa con le modifiche necessarie. Ciò significa confrontare la mappa utilizzata per contenere gli stati della risorsa con la mappa che contiene le risorse quando è stata eseguita la registrazione (in base al metodo di registrazione) e includere tutte le risorse aggiunte o eliminare le risorse rimosse.

È necessario pertanto che la procedura OnRegistration esegua una funzione che confronti le risorse monitorate rispetto alle nuove risorse allocate in modo da strutturare le risorse monitorate di conseguenza.

L'oggetto di contesto comprende un insieme di metodi che confrontano i metodi di registrazione. Viene restituita una mappa con tutte le risorse che costituiscono una parte delle risorse in base al metodo di registrazione.

Nell'esempio seguente la registrazione della formula è ByContractParty e lo stesso metodo è pertanto utilizzato da Context.ResourcesOfContractParty. Viene restituita una mappa con tutte le risorse che costituiscono una parte di questo insieme al momento di registrazione.

Per confrontare le due mappe, è necessario scorrere le mappe in parallelo. È possibile scorre le mappe mediante l'istruzione For Each. Questa istruzione consente di scorrere i valori di una mappa e, pertanto, è necessaria un'altra mappa speculare alla mappa degli stati in modo da poter scorrere le risorse e non i rispettivi valori di stato. Questa istruzione consente di scorrere i valori di una mappa e non le relative chiavi. Di conseguenza, è necessaria un'ulteriore mappa contenente gli ID sia come chiave e sia come valore. Inoltre, mantenere la mappa speculare per riflettere la mappa degli stati continuamente, in modo che abbia sempre lo stesso gruppo di risorse. Ciò significa che, quando la mappa degli stati viene aggiornata, è necessario aggiornare anche la mappa speculare.

La seguente figura mostra il concetto di mappe di mirroring.

Esempio:

Dim ServerAvailabilityIndicators
Dim MonitoredServers
Set ServerAvailabilityIndicators=CreateObject("SlalomMap.Map")
Set MonitoredServers=CreateObject("SlalomMap.Map")

Sub OnRegistration(dispatcher)
   dispatcher.RegisterByContractParty "OnAvailabilityEvent",_
      "Availability Event", "SAP Production Server"
   Dim AllocatedServers
   Set AllocatedServers = Context.ResourcesOfContractParty("SAP Production Server")
   UpdateMonitoredServers AllocatedServers
End Sub

Sub UpdateMonitoredServers(allocatedServers)
   Dim Server
   For Each Server In allocatedServers
      If Not MonitoredServers.Exist(Server) Then
         MonitoredServers(Server) = Server
         ServerAvailabilityIndicators(Server)=True
      End If
   Avanti

   For Each Server In MonitoredServers
      If Not allocatedServers.Exist(Server) Then
         MonitoredServers.Erase Server
         ServerAvailabilityIndicators.Erase Server
      End If
   Avanti
End Sub

Esempio:

La funzione seguente illustra come viene utilizzata la mappa di mirroring per scorrere la mappa degli stati quando richiesto per valutare lo stato dell'intero sistema in base allo stato di ciascuna risorsa monitorata.

In questo esempio, il sistema viene considerato disponibile se tutte le risorse sono disponibili. La presenza di un singolo componente non attivo è sufficiente per considerare il sistema non attivo:

Function SystemAvailability
   Dim Server
   For Each Server In MonitoredServers
      If ServerAvailabilityIndicators(Server) = DOWN then
         SystemAvailability=DOWN
         Exit Function
      End if
   Avanti
End Function

Un esempio di business logic completa con la gestione di risorse dinamiche viene descritto nel seguente esempio di modello di progettazione.