首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否应持久化此流程管理器状态?

是否应持久化此流程管理器状态?
EN

Stack Overflow用户
提问于 2020-05-16 06:06:51
回答 3查看 152关注 0票数 4

我正在开发一个事件源电动汽车充电站管理系统,该系统连接多个充电站.在这个领域中,我已经为充电站提供了一个集合,它包括充电站的内部状态(无论它是否连接,它的连接器的内部状态)。

我可以向一个站点聚合发出的命令是:

  • UnlockConnector,发射StationConnectorUnlocked
  • StopConnectorEnergyFlow,,发射StationConnectorEnergyFlowStopped

我想出了另一个集合,它表示充电会话,用户和充电站连接器之间的交互。充电会话的创建与这些事件相耦合,即如果连接器已被用户解锁,则创建会话,如果连接器的能量流停止,则充电会话已经完成。

我添加了一个流程管理器,用于侦听事件:

  • StationConnectorUnlocked(stationID, connectorID) -> SessionCreated(new uuid())
  • StationConnectorEnergyFlowStopped(stationID, connectorID) -> SessionFinished(id???)

对于第一个事件,创建会话是非常直接的。但是,对于后者,它必须知道正在进行的会话的sessionID,该会话发生在Connector(connectorID) of Station(stationID)上,因此它可以更新会话。

我不能简单地实现一个GetSessionByConnectorID函数,因为我正在实现一个事件源系统,而获得会话的事件流的唯一方法是通过它的ID,而不是通过它的ConnectorID (因为我只知道会话的ConnectorID当我恢复水合物时),所以我不知道如何实现GetSessionByConnectorID函数。

因此,流程管理器有一些内部内存状态((stationID, connectorID) -> (sessionID)),以跟踪sessionID.但是,由于它是内存中的,一旦进程管理器崩溃,我就失去了(stationID, connectorID) <-> (sessionID)和ConnectorEnergyFlowStopped事件之间的关联。

我该怎么处理呢?我是否应该坚持状态?如果我坚持使用Process事件(这会很尴尬,因为它与无处不在的语言没有很好的关联,我认为SessionProcessManagerReceivedStationConnectorUnlockedEvent-尴尬级别)

编辑-新思想

我想到了另一件事,那就是移除内部Process状态,并将(stationID, connectorID) <-> (sessionID)的关联放在Station聚合的内部。不幸的是,这将意味着更高的耦合(站点必须知道什么时候创建会话,以及如何生成它的ID),但我认为它可能更简单(因为站点的事件是持久化的)。因此,空间站会发出与会话相关的事件,其中包含sessionID:

  • StationConnectorUnlocked(stationID, connectorID, sessionID) -> SessionCreated(sessionID)
  • StationConnectorEnergyFlowStopped(stationID, connectorID, sessionID) -> SessionFinished(sessionID)

但是,将这两件事混合起来确实有点奇怪,即使这只是会话的ID。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-16 16:12:22

我可以看到很多解决这个问题的方法,但是我不熟悉你的领域,所以我只想在这里提出一些想法:

  • 使用流程管理器。流程管理器处理长期运行的流程,并需要持久化状态_by定义。消息驱动的流程管理器通常不需要在消息之间运行,所以他们处理事件、发出命令并关闭直到下一条消息。或者最后确定。据我所知,这是来自车站的初始question.
  • Issue会话UUID,用于每个会话。然后,站点将知道会话ID,并且不需要进程管理器。
  • 使用查询模型。使用所需的所有信息项目会话启动事件。当能量流停止以查找给定站点和连接器的正在进行的会话时,查询它,您甚至可能不需要用户id。项目sessionClosed事件并删除读取模型.

如果可能的话,我会选第二个。最后一个将在我的列表中排在第二位,由于相关的复杂性,流程管理器将是最后的手段。

票数 2
EN

Stack Overflow用户

发布于 2020-05-17 03:26:11

对我来说,过程经理只是妨碍了我的到来。聚合不应该从任何地方产生,我认为您过于担心StationSession的了解。

为什么不像session = station.unlockConnector(sessionId)那样表现出来呢?使用ARs上的工厂方法来创建新的相关ARs是非常常见的,除非会话是完全独立的BC。

此外,Session的生命周期似乎与Station密切相关。当连接器关闭时,您能提供最终的一致性吗?如果会话在连接器关闭的同时发生变异怎么办?

票数 4
EN

Stack Overflow用户

发布于 2020-05-17 12:57:32

我认为这个问题应该从自动售货机的角度来考虑,希望下面的答案可以帮助设计你的集合体。https://sourcemaking.com/design_patterns/state

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61832590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档