- 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/
我知道这类问题已经得到解答,但就我而言,我已经尝试了所有配置,但仍然不起作用。我需要对我的配置有一个新的看法(我确信我错过了一些东西)。两个附加程序都会记录所有级别 我想将所有包的信息 >= 记录到控
我正在对 Windows 移动设备上的代码性能进行一些基准测试,并注意到某些算法在某些主机上的表现明显更好,而在其他主机上则明显更差。当然,考虑到时钟速度的差异。 供引用的统计数据(所有结果均由同一个
我有一个程序可以计算多边形的面积和周长。程序还会确认面积和周长的计算结果是否与预期结果相同。 我不明白发生了什么,但确认面积和周长是否与预期相同的验证部分无法正常工作。 例如,我现在测试并在所有情况下
Codepen :(对于那些想直接进入的人来说,这是一个代码笔。在 Chrome 和 IE 中尝试一下,看看结果的不同) 我正在尝试使用 css3 转换/过渡,因为它们比 jquery 效果更流畅。
我有几个不同的正则表达式要在给定文本中匹配和替换。 regex1 :如果文本包含单词“Founder”,则将所有文本替换为首席执行官 正则表达式2:如果文本包含9位数字,则将其替换为NUM 我尝试使用
我编写了多线程应用程序,它从每个线程的数据库连接到一些电子邮件帐户。我知道 JavaMail 没有任何选项可以使用 SOCKS5 进行连接,因此我决定通过 System.setProperty 方法使
如您所见,这是我当前 Storyboard的不同设备预览。底部的透明绿色被另一个 View Controller 占用,但需要为每个不同的尺寸类固定间距。我尝试将 Storyboard 中的宽度和高度
我正在创建一个游戏,我需要能够改变玩家 Sprite 的速度。我认为最好的选择是通过重力影响 Sprite 。为了给用户运动的感觉,我希望背景以完全相同的速度向相反的方向移动。 我怎样才能给背景一个不
我正在查看BTrees库并注意到有多个 TreeSet (和其他)类,例如 BTrees.IOBTree.TreeSet BTrees.OOBTree.TreeSet BTrees.LFBTree.T
我有一个小型 C++ 库,必须为 armeabi 和 armeabi7a 编译。我还有一个非常大的 c++ 库,只需要为 armeabi 编译。现在正在为两种架构编译它们(使用 NDK),但这使我的
我需要根据站点的当前部分稍微更改主题。 似乎 MuiThemeProvider 只在加载时设置 muiTheme;但需要在 props 变化时更新。 如何做到这一点? 最佳答案 您可以尝试将主题放在包
如何创建两个每个都有自己的计数器的 lSTListing 环境? 如果我使用例如 \lstnewenvironment{algorithm}[2]{ \renewcommand\lstlist
我想使用 Travis-CI 和 Github 基于分支设置部署。 IE。 - 如果我们从 develop 构建- 然后执行 /deploy.rb使用 DEV 环境主机名,如果 master - 然后
我有一个带有数据验证的 WPF MVVM 数据表单窗口。很多控件都是文本框。目前,数据绑定(bind)触发器设置为默认值,即。 e.失去焦点。这意味着仅在可能完全填写字段时才对其进行验证。所以当删除一
我有许多应用程序的内容页面,并最终为每个内容页面编写了很多 View 模型。例如。如果我有一个包含项目组的列表,我将有一个 ShowAllViewModel并绑定(bind)到内容页面和列表中单个项目
我有一个通用 View 和 4 个其他 View 。我在通用 View 中使用 Bootstrap 选项卡(导航选项卡)。我希望其他 4 个 View 成为通用 View 中 4 个选项卡的内容。由于
我希望针对 Maven 发布插件的不同目标有不同的配置选项。故事是这样的: 我正在将 Git 用于 SCM。我希望release:prepare插件在本地完成所有操作,并让release:perfor
我正在为一个项目使用AbstractTableModel制作一个自定义TableModel,并且我需要找到一种方法让复选框显示在某些行上,而不是其他行上。我已经实现了 getColumn 方法,但我希
摘自《Javascript 忍者的 secret 》一书: EVENTS ARE ASYNCHRONOUS Events, when they happen, can occur at unpredi
我正在尝试配置我的第一个 GWT 记录器,到目前为止,我已经将日志消息打印到我的 JS 控制台(FF 的 Firebug): 最终,我希望非SEVERE 消息转到consoleHa
我是一名优秀的程序员,十分优秀!