【问题标题】:How can I use Azure Service Bus transactionaly with Azure DocumentDB如何将 Azure 服务总线与 Azure DocumentDB 一起使用
【发布时间】:2015-08-26 09:20:55
【问题描述】:

我希望能够在 DocumentDB 中保存/更新文档,然后在 Azure 服务总线上发布事件,我希望这些以原子方式发生。

Azure 服务总线不支持分布式事务,因此对于 SQL 数据库,我保存我的记录并将记录放入消息队列表中,所有这些都在 SQL 事务中。然后,一个进程读取消息队列表并将消息放入队列并在成功时将它们从队列中删除(利用服务总线的重复数据删除,以防消息被添加两次)。

但 DocumentDB 不支持跨集合的事务,因此我无法更新文档然后将文档添加到消息队列集合中。

如何确保我对文档的更改会在总线上发布?

【问题讨论】:

  • Paul,您在哪里看到有关如何使用 DocumentDB 集合作为消息队列的文档?如果这允许您配置过滤器参数,那么您可以将消息排入同一集合中。或者,如果您认为您将有一些其他机制从 DocumentDB 集合中提取它并将其推送到总线上,那么您绝对可以编写该代码来查找特定类型的文档。我自己对这个话题很感兴趣。我一直在使用 DocumentDB 实现自己的队列和主题,但我希望拥有一个真正的服务总线。
  • 自 2019 年起,cosmosdb 不支持在同一事务中添加和更新文档,除非您使用存储过程(即使那样,它们也需要位于同一分区中)。您是否使用存储过程来执行这些操作?

标签: azure transactions azureservicebus azure-cosmosdb


【解决方案1】:

我不完全确定我理解了这个问题,但是......从事务的角度来看,您可以将您的数据和 queue 文档放在同一个集合中(只要确保您有某种类型的微分器,例如 Type 属性,用于过滤)。

编辑 - 反映触发器和事务

此外,DocumentDB 支持前触发和后触发操作,因此您可以设置后触发以在数据文档插入完成后写入附加文档。如 cmets 所述(根据@Ryan):触发后操作包含在事务中。

【讨论】:

  • 是的,与其他文档数据库相比,集合更类似于关系表,我在 DocumentDB 中发现它更类似于数据库。
  • 对@David 的回答进行了小幅更正;触发操作将发生在与原始上下文写入相同的事务中。如果未写入内容,则 (post) 触发器将不会触发。如果post触发失败,DocmentDB会回滚原来的写操作。
  • @RyanCrawCour-MSFT - 谢谢!将编辑答案以反映。
猜你喜欢
  • 2021-08-08
  • 1970-01-01
  • 2018-09-01
  • 2016-05-23
  • 2018-07-27
  • 2021-12-19
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多