上一主题: 案例研究 12:使用计数器逻辑计算故障次数

下一主题: 案例研究 14:时间累积时钟处理

案例研究 13:动态组件组处理

通常需要存储资源组的值,该组的成员可能是动态的,在计算期间内可能会发生变化。 在以下要求示例计算中,有必要对每个资源执行中间计算,以便达到最终聚合结果。

以下是几个这样的示例:

示例

对于以下计算要求:

计算由服务器群集组成的系统的可用性百分比。 仅在所有基础服务器都可用时,才会认为该系统可用。

解决方案设计将按如下所示实施:

根据其基础群集资源的可用性来评估系统可用性。 在这种情况下,需要管理并存储所有群集资源的状态,以便及时评估每个时间点上的系统状态。

为了执行此操作,需在公式中放置映射(以下示例代码中的 ServerAvailabilityIndicators 映射),而且在映射中针对每个受监视资源包含一个条目。 由于所有映射对象都需要键字段来引用关联值,此映射将使用资源指示符作为键(资源 ID),其值为组件状态。 只要组件状态发生了变化,此映射中的相关条目也应更改。 针对每个可用性事件,该公式将更新映射中相关资源的状态,并相应地重新评估系统状态。

由于受监视资源可能会发生变化(计算期间可能会删除或添加一些资源),因此必须在公式中添加相关的函数来进行管理,该函数应能标识更改并能通过为新组件添加条目或删除已删除组件的条目来更新受监视组件的映射。

OnRegistration 是一个事件处理程序,可以管理在受监视资源中发生更改时触发的注册事件。 根据公式的注册方法,如果提交的资源(或更改集)更改了计算中包括的资源,就会导致发生这种变化。

在每次注册期间,都需要更新保存有资源状态的映射,让其包含所需的任何更改。 这意味着,当注册运行(基于注册方法)并包括已添加的所有资源或删除已移除的资源时,需要对比保存资源状态的映射与保存资源的映射。

因此,OnRegistration 过程必须执行函数来对比受监视的资源与新分配的资源,以便相应地确定受监视资源的结构。

Context 对象具有一套与注册方法类似的方法。 这些方法返回包含所有资源的映射,这些资源根据其注册方法归属到相应的资源。

在以下示例中,公式通过 ByContractParty 进行注册,因此 Context.ResourcesOfContractParty 也将采用同样的方法。 这将返回包含所有资源的映射,这些资源在注册时为此集合的一部分。

要比较两种映射,需要在两种映射中并行进行迭代。 可以采用“For Each”语句进行映射迭代。 该语句允许通过映射的值进行迭代,因此需要另一个映射来镜像状态映射,这样,就能通过资源而非状态值进行迭代。 该语句迭代映射的值,而不是其键。 因此,需要一个保存 ID 以同时作为键和值的额外映射。 此外,需要维护镜像映射以便持续镜像状态映射,从而使其始终保持同一资源集。 这意味着,只要状态映射发生了更新,镜像映射也必须相应更新。

下图显示了镜像映射的概念。

示例

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
   Next

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

示例

以下函数演示了在需要根据每个受监视资源的状态来评估整个系统的状态时,如何使用镜像映射对状态映射进行迭代。

在此示例中,如果所有资源都可用,则认为系统可用。 只要有一个组件处于停机状态,则足以认为系统处于停机状态:

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

在以下设计模式示例中,介绍了一个具有动态资源处理的完整业务逻辑示例。