- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Mass Transit 的新手,我想了解它是否对我的场景有帮助。我正在构建一个使用 CQRS 事件源架构实现的示例应用程序,我需要一个服务总线来将命令堆栈创建的事件分派(dispatch)到查询堆栈非规范化器。
假设在我们的域中有一个聚合,我们称之为Photo,以及两个不同的域事件:PhotoUploaded 和PhotoArchived。
在这种情况下,我们有两种不同的消息类型,默认的 Mass Transit 行为是创建两种不同的 RabbitMq 交换:一种用于 PhotoUploaded 消息类型,另一种用于 PhotoArchived 消息类型。
让我们假设有一个名为 PhotoDenormalizer 的去规范化器:此服务将成为两种消息类型的消费者,因为每当上传或存档照片时都必须更新照片读取模型。
给定默认的 Mass Transit 拓扑,将有两个不同的交换,因此无法保证不同类型事件之间的消息处理顺序:我们拥有的唯一保证是所有相同类型的事件将按顺序处理,但我们不能保证不同类型事件之间的处理顺序(请注意,鉴于我的示例的事件语义,处理顺序很重要)。
我该如何处理这种情况? Mass Transit 是否适合我的需要?我是否完全忽略了域事件调度的要点?
最佳答案
免责声明:这不是对您问题的回答,而是一个预防性信息,说明您为什么不应该做您打算做的事情。
虽然像 RMQ 这样的消息代理和像 MassTransit 这样的消息中间件库非常适合集成,但我强烈建议不要使用消息代理进行事件溯源。可以引用我以前的回答Event-sourcing: when (and not) should I use Message Queue?这解释了背后的原因。
您发现自己的原因之一是永远无法保证事件顺序。
另一个明显的原因是,从通过消息代理发布的事件构建读取模型有效地消除了重放和构建需要从一开始就开始处理事件的新读取模型的可能性,但他们得到的只是现在正在发布的事件。
聚合形成事务边界,因此每个命令都需要保证它在一个事务内完成。虽然 MT 支持 transaction middleware ,它只保证您获得支持它们的依赖项的事务,而不是消费者主体中的 context.Publish(@event)
,因为 RMQ 不支持事务。您很有可能提交更改而不是在读取端获取事件。因此,根据事件存储的经验法则,您应该能够从存储 订阅更改流,而不是从您的代码发布事件,除非那些是集成事件而不是域事件。
对于事件溯源,至关重要的是每个读取模型在其转换的事件流中保留自己的检查点。消息代理不会给你那种权力,因为“检查点”实际上是你的队列,一旦消息从队列中消失 - 它就永远消失了,不会再回来了。
关于实际问题:
您可以使用 message topology configuration为不同的消息设置相同的实体名称,然后将它们发布到同一个交换,但这属于“滥用”类别,就像 Chris 在该页面上写的那样。我没试过,但你绝对可以尝试。消息 CLR 类型是元数据的一部分,因此不应该存在反序列化问题。
但同样,将消息放在同一个交换器中不会给您任何顺序保证,除了所有消息都将进入一个队列以供消费服务这一事实。
您至少必须根据聚合 ID 设置分区过滤器,以防止并行处理同一聚合的多条消息。顺便说一下,这对于集成也很有用。我们就是这样做的:
void AddHandler<T>(Func<ConsumeContext<T>, string> partition) where T : class
=> ep.Handler<T>(
c => appService.Handle(c, aggregateStore),
hc => hc.UsePartitioner(8, partition));
AddHandler<InternalCommands.V1.Whatever>(c => c.Message.StreamGuid);
关于rabbitmq - 公共(public)交通 : ensure message processing order when there are different message types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010432/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: When should [assembly: InternalsVisibleTo()] be used?
问题与微服务有关,当我有多个微服务提供将被订购和计费的功能/服务时。 我正在确定采用哪种方法, a) 每个可计费微服务有一个订单和一个计费服务,有各自的数据库。b) 跨所有微服务的通用订单管理和计费服
我正在尝试使用 gcloud图书馆。 (ns firengine.state (:import [com.google.cloud AuthCredentials] [com.goog
Java 允许定义以下一对类。 class Class1 { ... } public Class2 { public Class2(Class1 c1) { ... } } 如果因为 Class1
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
好吧,这是一个满口的标题。不过,这让我明白了。这是我的代码的要点,在 jar 里: public class NetworkShared { public static class Login
我在使用 ltree 时遇到 PHP 问题来自 PostgreSQL .我在 SQL 中这样做: SELECT * FROM tabla t WHERE t.parent_path " for "OP
我知道如何为类/接口(interface)/包的子集生成 Javadoc。但是有没有办法只为公共(public)方法的一个子集生成 Javadoc? 我更喜欢能够将方法(Javadoc 标记或注释)标
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: c#: why have empty get set properties instead of usin
在我们的每个项目中,都有一个文件用于存储该项目中使用的各种SQL 语句。类的声明方式和字符串的声明方式有一些变化。 示例类声明: internal sealed class ClassName int
我根据 http://docs.jquery.com/Plugins/Authoring 定义了我的插件 (function( $ ){ var methods = { init : fu
我正在使用 Inno Setup 来构建我的安装程序,我有 C:\Users\Public文件夹硬编码在我的 [Files] 中放置一些文件的部分(Inno Setup 没有此文件夹的常量) 我的目标
我有一个 dataframe1 包含像 'ID', 'A', 'B', 'C', 'D', 'E', 'F', 'G' 这样的列. 现在,我创建了两个数据框, dataframe2 包含 'ID',
我有一个抽象类,不幸的是我无法更改它的定义,它基本上提供了一个抽象方法,有点像。 public abstract void do(Data someData, BaseInterface interf
我刚刚在重构时偶然发现了一段奇怪的代码。它看起来像是分解出两个 readString() 方法的共同部分的候选者,只是它似乎是不可能的(这对我来说是一个令人毛骨悚然的脑筋急转弯): private f
是否有解析为公用文件夹的属性?显然,我不想在目录结构中对“c:\users\public”进行硬编码,但我找不到预定义的 Property解决这个问题。是否有一种可接受的方式来指定要在此处安装和/或在
我试图将值从一个类传递到另一个类。 subPanel1 类读取全局变量,但当我通过调整监听器更新这些变量时,它不会更改值。我试图将 rc、gc 和 bc 变量从 subPanel2 类传递到 subP
我想使用具有自动属性的干净且编码较少的类。所有属性(property)都是公共(public)的。在同一类的方法中我也使用了该属性。因此,我认为这种方法是可混搭的,因为我将公共(public)属性用于
不久前,我在 Android 应用程序中创建了一个 SQLiteHelper 类。我不是 100% 确定原因,但表名和列名是嵌套公共(public)静态抽象类中的公共(public)静态最终字段。我记
这个问题已经有答案了: Cannot make a static reference to the non-static method (8 个回答) 已关闭 3 年前。 我正在为类(class)做一
我是一名优秀的程序员,十分优秀!