Tópico anterior: Estudo de caso 12: Usando a lógica do contador para calcular o número de falhas

Próximo tópico: Estudo de caso 14: Controle do relógio de acumulação de tempo

Estudo de caso 13: Tratamento do grupo dinâmico do componente

É frequentemente necessário armazenar valores para um grupo de recursos em que os integrantes deste grupo podem ser dinâmicos e alterados durante o período do cálculo. No exemplo cálculo obrigatório a seguir, é necessário executar um cálculo intermediário em cada um dos recursos para obter o resultado agregado final.

A seguir estão alguns exemplos:

Exemplo:

Para o requisito de cálculo a seguir:

Calcular a porcentagem de disponibilidade de um sistema que é composto de um agrupamento de servidores. O sistema é considerado disponível somente quando todos os servidores subjacentes estiverem disponíveis.

O design da solução será implementado como segue:

A disponibilidade do sistema é avaliada pela disponibilidade de seus recursos de agrupamento adjacentes. Nesse caso, é necessário gerenciar e armazenar o status de todos os recursos agrupados para avaliar o status do sistema o tempo todo.

Para fazer isso, a fórmula é necessária para manter um mapa (mapa ServerAvailabilityIndicators no código de exemplo a seguir) que tem uma entrada para cada um dos recursos monitorados. Como todos os objetos do mapa requerem um campo chave para fazer referência ao valor associado, este mapa terá o indicador de recursos como a chave (que é a ID do recurso) e o valor será o componente de status. Sempre que o status de um componente é alterado, a entrada relevante do mapa deve ser alterada. De acordo com o evento de disponibilidade, a fórmula atualizará o status do recurso relevante no mapa e irá reavaliar o status do sistema adequadamente.

Uma vez que os recursos monitorados podem ser alterados (alguns podem ser removidos e outros podem ser adicionados durante o período de cálculo), isto deve ser gerenciado dentro da fórmula adicionando uma função que identifica a alteração e atualiza o mapa do componente monitorado por meio da adição de uma nova entrada para um novo componente ou da exclusão de uma entrada, se um componente foi removido.

O OnRegistration é o manipulador de eventos que gerencia um registro de evento e é acionado quando ocorre uma alteração nos recursos monitorados. Tais alterações podem ocorrer como resultado da confirmação de um recurso (ou o conjunto de alterações) que pode gerar alterações nos recursos incluídos no cálculo de acordo com o método de registro da fórmula.

Durante cada registro é necessário atualizar o mapa que contém o status do recurso com as alterações necessárias. Ou seja, comparar o mapa usado para manter o status do recurso com o mapa que contém os recursos no momento em que o registro é executado (com base no método de registro), bem como incluir todos os recursos que foram adicionados ou excluir os recursos que foram removidos.

O procedimento do OnRegistration deve executar uma função que compara os recursos monitorados com os novos recursos alocados a fim de estruturar os recursos monitorados adequadamente.

O objeto Contexto tem um conjunto de métodos que compara os métodos de registro. Eles retornam um mapa com todos os recursos que são parte dos recursos de acordo com o método de registro.

No exemplo a seguir, o registro da fórmula é ByContractParty e o mesmo método é usado pelo Context.ResourcesOfContractParty. Isso retorna um mapa com todos os recursos que são parte deste conjunto no momento do registro.

Para comparar os dois mapas, é necessário realizar a iteração por meio dos mapas em paralelo. A iteração dos mapas é feita usando a declaração For each. Essa declaração permite a iteração dos valores de um mapa. Assim, é necessário outro mapa como um espelho ao mapa de status para poder fazer a iteração dos recursos e não de seus valores de status. Essa declaração reitera os valores de um mapa e não de suas chaves. Portanto, é necessário um mapa adicional que contenha as IDs como uma chave e também como um valor. Além disso, mantenha o mapa de espelhamento para refletir, de modo contínuo, o mapa de status, de modo que ele sempre contenha o mesmo conjunto de recursos. Isso significa que quando o mapa de status for atualizado, o mapa de espelhamento também deverá ser atualizado.

A figura a seguir mostra o conceito dos mapas de espelhamento.

Exemplo:

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)
   Servidor Dim
   Para cada servidor no allocatedServers
      If Not MonitoredServers.Exist(Server) Then
         MonitoredServers(Server) = Server
         ServerAvailabilityIndicators(Server)=True
      End If
   Próximo

   Para cada servidor no MonitoredServers
      If Not allocatedServers.Exist(Server) Then
         MonitoredServers.Erase Server
         ServerAvailabilityIndicators.Erase Server
      End If
   Próximo
End Sub

Exemplo:

A função a seguir mostra como o mapa de espelhamento é usado para iteração do mapa de status quando necessário para avaliar o status de todo o sistema com base no status de cada recurso monitorado.

Neste exemplo, o sistema é considerado disponível se todos os recursos estiverem disponíveis. Ter um único componente desativado é suficiente para considerar o sistema desativado:

Function SystemAvailability
   Servidor Dim
   Para cada servidor no MonitoredServers
      If ServerAvailabilityIndicators(Server) = DOWN then
         SystemAvailability=DOWN
         Função de saída
      End if
   Próximo
End Function

Um exemplo completo de lógica de negócios com tratamento dinâmico do recurso é descrito no exemplo de padrões de design a seguir.