3

背景

有一个消息队列域。该域可能与某些消息队列技术一起使用。在这种特殊情况下,它绑定到Windows Azure Service Bus

某些项目具有注册Windows Azure 服务总线主题(基本上是消息队列)的操作。

注册一个新的消息队列意味着:

  1. 启动域事务(即数据库事务)。
  2. 添加一个带有一些相关信息的消息队列域对象(例如哪个用户注册它或属于哪个应用程序属于整个消息队列)。
  3. 使用控制反转来处理消息队列服务器中的实际队列注册(在这种情况下,它将针对 Windows Azure 服务总线发生)。
  4. 如果没有任何问题,域事务就会被提交,并且相关的域对象会被持久化或更新。

如果域事务成功结束并且Windows Azure 服务总线主题注册工作正常,它应该可以正常工作。

问题

但是,如果域事务成功结束但Windows Azure 服务总线无法注册主题 - 即消息队列 - 会发生什么?

是的,您有一个损坏的域

如果在域事务开始之前进行Windows Azure 服务总线主题注册,会发生什么情况?好吧,如果一切顺利,没问题。但是现在问题已经倒转过来了:如果Windows Azure 服务总线主题被正确注册但后来域事务失败了怎么办?

是的,第二种情况比第一种情况要好,因为该操作注册了一个无用的消息队列,但域不会知道它。现在的主要问题是不确定数量的事务可能会失败,并且未知数量的消息队列将毫无用处。

试想一下,如果这是一个严肃的大型业务服务:大量无用的消息队列和一个系统管理员(一个人)每月删除无用的消息队列

那么——现在的问题是——?

由于我发现使用无用的消息队列比使用损坏的域更好,因此我选择继续使用这种方式,但是... Windows Azure 具有任何类型的分布式事务机制以包含任何远程对象在原子事务中创建包括其他特定于域的操作?,如果不是 - 遗憾的是我相信这是实际情况 - 你将如何解决这种情况?

笔记:

我正在寻找这样的东西,因为我真的不喜欢有一个根本无法处理其用例的域。我宁愿避免这种情况,让域正常工作并控制一切

一些有趣的链接...

我发现了一些关于这个主题的有趣链接:

http://blogs.msdn.com/b/clemensv/archive/2012/07/30/transactions-in-windows-azure-with-service-bus-an-email-discussion.aspx

4

1 回答 1

6

你可以通过使用states来解决这个问题。想象一下以下工作流程:

  1. 注册域并将其状态设置为待处理
  2. 创建服务总线主题
  3. 将域的状态设置为活动

然后你可以有一个检查待处理域的小过程:

  • 如果域处于待处理状态但主题存在,则将状态设置为活动(在这种情况下,步骤 3 可能失败)。
  • 如果域处于待处理状态但主题不存在,请尝试重新创建主题或向可以手动检查正在发生的事情的人发送警报

有了重试策略(如 TOPAZ),99% 的请求都不会出现任何问题。但每当出现问题时,它会自动修复,如果无法修复,则会升级为人工干预。

替代方案类似于 Clemens 的博客文章,您在 SQL Azure 中使用发件箱表,并在注册域的同一事务中写入该发件箱表。

于 2012-11-20T10:21:32.727 回答