gpt4 book ai didi

.net - 原子性 : Database transaction and Windows Azure

转载 作者:行者123 更新时间:2023-12-01 23:18:15 25 4
gpt4 key购买 nike

背景

有一个消息队列域。该域可以与某些消息队列技术一起使用。在本例中,它绑定(bind)到Windows Azure 服务总线

某些项目有一个注册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

最佳答案

您可以使用状态在没有事务的情况下解决这个问题。想象一下以下工作流程:

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

然后您可以有一个小流程来检查待处理域:

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

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

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

关于.net - 原子性 : Database transaction and Windows Azure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13469870/

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