如何处理nservicebus中的消息顺序?

2024-02-11

我试图找到一种按照发送者发送消息的顺序处理消息的方法,因为 NServiceBus 不保证消息将以特定顺序处理。

发送者是一个订单系统,它发布 createOrder 和 reviseOrder 命令。发送者允许用户向同一订单提交多个修订,因此队列中可以同时有修订 4 和修订 3。每个修订版都有一个修订版号和与之关联的原因代码,它们驱动一些业务逻辑,因此我们不能忽略任何修订版或至少是其中的原因部分。

下面列出了我的一些想法 -

  1. 将修订号与目标记录一起存储。发送者在每条修订消息中发送其修订号。处理程序比较发送者和目标修订号,如果它们匹配,则更新记录,否则消息将被放置在队列的末尾。使用这种方法,如果修订版 2 消息失败并进入错误队列,则修订版 3 将永远不会被处理。

  2. 发件人发送每条修订消息上所有修订的所有原因代码的历史记录。因此,如果修订版 2 消息失败,修订版 3 消息将包含所有原因代码。这些原因代码将记录在目标中,但与先前修订原因代码关联的任何业务逻辑可能不会发生。

针对这种场景我们该如何设计呢?
还有关于如何处理失败的修订消息的任何想法吗?

非常感谢一些指导。

Thanks.


关于 NserviceBus 的开箱即用的主要准则之一是,您应该以顺序无关紧要的方式构建系统。话虽如此,我之前已经与 NSB 构建了一个有序系统,以下是我决定这样做的方式:

  • 为所有消息添加序列号
  • 在接收器中检查序列号是最后看到的数字+1,如果不是则抛出乱序异常
  • 启用二级重试(因此,如果它们出现故障,他们将在收到正确的消息后再次尝试)

这通常工作得很好,但有时如果某些东西出现故障时间太长并且需要手动干预来重新排序,那么有时会有点不正常。

在您的情况下可能有更好的方法。鉴于您只想在按订单进行的修订中订购。我认为你可以用一种不需要有序交付的方式来构建它。

  • 将修订号添加到您可以使用修订版进行修改的所有字段
  • 仅当消息中的修订号 >= 数据库中的最后一个修订版时才更新字段

这有很多好处。

  • 它不依赖于顺序
  • 它只要求接收者处理每条消息一次,从而减少负载
  • 如果单条消息出现问题,它不会停止所有事情,从而可以很好地处理错误。

但它有以下缺点:

  • 增加了数据库的复杂性
  • 它最终是一致的,如果您查看数据库,它可能只包含用户所做的一些编辑。
  • 如果 rev2 错误并且 rev3 处理正确,则某些用户编辑将不会出现,但有些会出现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理nservicebus中的消息顺序? 的相关文章

  • SignTool 错误:访问被拒绝

    我尝试在安装了 VS2010 的 Windows Server 2008 R2 x64 上使用新的代码签名证书对 NET 应用程序进行authenticode 签名 但 SignTool 始终响应访问被拒绝 SignTool exe sig
  • ASP.NET - 在 GridView 中显示图像和 pdf

    我想在 asp GridView 中显示 图像 列 这个想法是提供图像的缩略图以及实际尺寸图像的链接 对于某些行 这也可以是 PDF 文档 我想要 PDF 的链接 PDF 或图像存储在 SQL 数据库中 现在我在处理程序 ashx 文件中出
  • 抓取内存中的 .net 进程

    我正在尝试保护我用 C 编写的中小型 MMO 但我们遇到了一些黑客问题 我想知道是否有一种方法可以获取当前位于内存中而不是磁盘上的进程的副本 我们在游戏中有一个非常安全的算法 但是它无法阻止人们修改游戏的内存版本 有什么办法可以做到这一点吗
  • 为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU?

    为什么下面的代码会产生 public static class Program public static void Main params string args var sourceFileName C Users ehoua Desk
  • 多个 Visual Studio 项目抱怨临时文件丢失,因此无法打开。错误代码 &H80070003

    我在终端服务器上运行 Visual Studio 2010 并且已经运行了一段时间 问题相对较少 今天早上 我启动了我的电脑 在英国的长周末期间 似乎出现了以下问题 我有很多项目 但不是我的所有项目 也不是给定解决方案中的所有项目 抱怨无法
  • C# 模拟接口与模拟类

    我是 net 中的最小起订量框架的新手 根据我的在线研究 似乎有两种方法可以使用这个框架 要么模拟接口 要么模拟具体类 似乎在嘲笑具体类时 只有virtual方法可以被嘲笑 就我而言 我只想模拟实现接口的类的几个方法 例如 如果我们有以下内
  • 修饰符 async 对此项目无效

    这似乎并不是数百个具有相同错误的其他问题的重复 我把它们都看过了 发现它们是无关的 我正在制作一个小笔记应用程序 并尝试从目录中读取文件 按照 MSDN 示例 我有以下代码 但它给了我一个错误 错误 1 修饰符 async 对此无效 项目
  • 有没有类似 ActiveRecord::Migration for .NET 的东西?

    我玩过 ruby on Rails ActiveRecord Migration类 我喜欢保持数据库模式版本化是多么容易 我想在我的 ASP NET 项目中做类似的事情 我想知道是否有人听说过一个可以执行以下操作的工具ActiveRecor
  • 将参数从 Web 表单传递到 Crystal 报表

    我有一份报告 我想将其显示在网络表单上 没有参数的报告运行良好 带参数的报告让我很头疼 这是我在 BindReport 方法中编写的代码 该代码在表单的页面加载事件上调用 ReportDocument rpt new ReportDocum
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • 如何将 ConcurrentDictionary 转换为字典?

    我有一个 ConcurrentDictionary 对象 我想将其设置为 Dictionary 对象 不允许在它们之间进行转换 那么我该怎么做呢 The ConcurrentDictionary
  • 依赖注入的惰性解析

    我有 net 课程 我使用 Unity 作为 IOC 来解决我们的依赖关系 它尝试在开始时加载所有依赖项 Unity中有没有一种方法 设置 允许在运行时加载依赖项 还有更好的解决方案 Unity 2 0 中对 Lazy 和 IEnumera
  • 学习实体框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在服务器桌面会话上捕获屏幕

    我开发了一个 GUI 测试框架 可以按计划对我们公司网站进行集成测试 当出现问题时 它会截取桌面等内容 它在专用 Windows Server 2008 上的登录用户上运行 无人值守 问题是在我已断开远程桌面会话连接的桌面上截取屏幕截图 我
  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • 如何打开实际上已关闭的 Wifi 适配器的无线电?

    我在用着托管无线网络 http managedwifi codeplex com获取我的 Wifi 适配器的无线电状态 如果收音机实际上已关闭 如何将其打开 像这样的东西 WlanClient wlanClient new WlanClie
  • WPF 中的屏幕分辨率问题?

    我将在 WPF 中使用以下代码检测分辨率 double height System Windows SystemParameters PrimaryScreenHeight double width System Windows Syste
  • 使用 ContractNamespace 属性设置 WCF DataContract 命名空间

    在设计我的服务时 我决定要自定义出现在生成的 WSDL 中的名称空间 对于数据合同 我遇到了合约命名空间 http msdn microsoft com en us library system runtime serialization
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐