【发布时间】:2020-05-16 06:06:51
【问题描述】:
我正在开发一个事件源电动汽车充电站管理系统,该系统连接到多个充电站。在这个领域中,我提出了充电站的聚合,其中包括充电站的内部状态(是否连接,其连接器的内部状态)。
我可以向 Station 聚合发出的命令是:
UnlockConnector,它发出StationConnectorUnlockedStopConnectorEnergyFlow,它发出StationConnectorEnergyFlowStopped
我想出了另一个代表充电会话的聚合,即用户和充电站连接器之间的交互。充电会话的创建与这些事件相结合,即如果连接器已被用户解锁,则创建会话,如果连接器的能量流已停止,则充电会话已完成。
我添加了一个监听事件的进程管理器:
StationConnectorUnlocked(stationID, connectorID)->SessionCreated(new uuid())StationConnectorEnergyFlowStopped(stationID, connectorID)->SessionFinished(id???)
对于第一个事件,创建会话非常简单。但是对于后者,它必须知道正在进行的会话的sessionID 发生在Station(stationID) 的Connector(connectorID) 上,因此它可以更新会话。
我不能简单地实现GetSessionByConnectorID 函数,因为我正在实现一个事件源系统,我可以获得会话的事件流的唯一方法是通过它的 ID,而不是通过它的 ConnectorID(因为我只知道会话的连接器ID,当我将它水化时),所以我不知道如何实现GetSessionByConnectorID 函数。
因此,进程管理器有一些内部内存状态((stationID, connectorID) -> (sessionID)),以跟踪sessionID。但是,由于它在内存中,一旦进程管理器崩溃,我就失去了(stationID, connectorID) <-> (sessionID) 之间的关联,并且我无法再正确响应 ConnectorEnergyFlowStopped 事件。
我应该如何处理?我应该坚持流程管理器状态吗?我是否应该通过流程管理器事件坚持它(这会很尴尬,因为它与通用语言没有很好的相关性,我在想SessionProcessManagerReceivedStationConnectorUnlockedEvent-awkward-level)
编辑 - 新想法
我想到了别的办法,那就是删除内部进程管理器状态,并将 (stationID, connectorID) <-> (sessionID) 的关联放入 Station 聚合内。不幸的是,这意味着更高的耦合(Station 必须知道何时创建会话,以及如何生成其 ID),但我认为它可能更简单(因为 Station 的事件是持久的)。因此,Station 会发出与会话相关的事件,其中包含 sessionID:
StationConnectorUnlocked(stationID, connectorID, sessionID)->SessionCreated(sessionID)StationConnectorEnergyFlowStopped(stationID, connectorID, sessionID)->SessionFinished(sessionID)
但是,将这两个东西混合起来似乎有点奇怪,即使它只是会话的 ID。
【问题讨论】:
-
图表会有所帮助。事件流程很难理解。我 95% 确定您不需要流程管理器。顺便说一句,流程管理器总是保持状态。但我认为这与这里无关。所以,问题标题的答案是“是”,但你的问题是建模问题,
-
正如我在另一个问题中提到的,我不知道在 ES 中解决这个问题的正确方法,如果没有 ES,我只会通过 ConnectorId 查询会话。所以,我刚刚有了一个想法:鉴于从 ConnectorId 到 SessionId 的映射是一个相对较短的需求,为什么不简单地将它存储在分布式缓存(Redis)中呢?您可以完全摆脱此流程管理器,只需实现使用 sessionRepository.GetByConnectorId() 的事件处理程序,并且在内部此 repo 可以使用缓存将 ConnectorId 转换为 SessionId。这使解决方案更简洁,并隐藏了 ES 技术需求
-
@AlexeyZimarev 我已经添加了一个图表来更清楚地解释它
-
@FrancescCastells 是的,这是有道理的,这实际上只是我需要的一个简单映射。我添加了一个新思路,但我认为这会导致更高的耦合度。
标签: events domain-driven-design event-sourcing saga process-management