gpt4 book ai didi

c# - 使用全局变量暂停事件源系统命令

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:56 24 4
gpt4 key购买 nike

在我的事件源系统中,我有一个端点,管理人员可以使用它在某些读取端不一致或损坏的情况下重建读取端数据库。

当这个端点被命中时,我想停止(或排队)常规系统命令,这样它们就无法被处理。我想这样做,以便在重建数据存储时不会发出事件并且不会进行读取端更新。如果发生这种情况,可以在重建过程中处理新的(实时)事件更新,并将读取端数据库置于不一致状态。


我打算使用一个带有一些静态属性的静态类(本质上是模拟一个全局变量),但是我读到这是不好的做法。

我的问题是:

  • 为什么在 OO 设计和 C# 中出现这种不良做法?
  • 我可以使用哪些其他解决方案来代替这个全局变量来完成此类通信?

最佳答案

Why is this bad practice in OO design and C#? (using global variables)

有很多 talks关于这个在社区上,但是非常简单,它使程序状态不可预测。

What other solutions can I use to accomplish this class communication in place of this global variable?

如果你只需要重建一个Readmodel,你不应该停止命令处理。 Write 模型应该像往常一样运行,因为它不需要读取端的数据(除非也有一些 Sagas)。客户端需要处理命令,因此重建应该透明地完成。

相反,您应该创建使用另一个(临时)持久性(另一个数据库/表/集合/其他)的 Readmodel 的另一个实例,并使用它来重建状态。然后,当重建完成后,您应该用这个新实例替换旧的/有故障的实例。

为了尽可能顺利地过渡,新的 Readmodel 甚至应该在重建开始之前订阅到事件流,但它不应该处理任何传入的事件。相反,它应该将它们与从事件存储或事件日志或您正在使用的任何事件源中获取的事件一起放入环形缓冲区

从这个环形缓冲区处理事件的算法应该是首先处理最早的。这样,新命令生成的新事件直到旧事件(重建开始前生成的事件)被处理后才被处理。

现在你有一个干净的 Readmodel 正在处理最新的事件(一个追赶的 Readmodel)你只需要它以某种方式替换错误的 Readmodel,即你在你的应用程序的组合根(依赖注入(inject)容器)中替换它.现在可以丢弃错误的 Readmodel。

关于c# - 使用全局变量暂停事件源系统命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51386261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com