如何在Cosmos DB中实现发件箱模式

时间:2019-07-13 08:23:50

标签: azure-cosmosdb azureservicebus outbox-pattern

我正在寻求在Cosmos DB中实现对发件箱模式的支持。

但是,Cosmos DB似乎不支持跨馆藏的交易。

那我该怎么办?

我一直在考虑实现此目的的几种方法:

使用服务总线交易

Service bus transaction scope内,发送消息(尚未提交),进行Cosmos DB更新,如果可行,则我们进行服务总线事务以使消息可用于订阅者。

使用触发器在发件箱集合中插入行

随着插入/更新的发生,我们使用Cosmos DB触发器将相应的消息插入发件箱表,此后一切照旧。

使用触发器执行Azure函数

创建Azure functions as Cosmos DB triggers。我几乎喜欢这个,但是直接向服务总线发送消息要好得多。

使用数据泵

添加两个字段UpdateTimestampOutboxMessageTimestamp。记录更新后,UpdateTimestamp也将更新。

某些过程会查找这两个不匹配的记录,并为每个记录创建一条通知消息并将其中继到相应的队列或主题。

当然,然后它会更新第二个时间戳,以便它们匹配。

有关如何执行此操作的其他想法?

1 个答案:

答案 0 :(得分:0)

通常,您将事物存储在cosmos db集合中。然后您有更改提要,将这些更改发送给某些观察者(比如说azure函数)。那么您的azure函数可以执行任何操作:将其放入其他使用者的队列中,保存到以其他方式投影的另一个集合中,依此类推...在您的azure函数中,您应该实现与函数运行时无关的失败的死信队列(例如,由于ID冲突而无法写入另一个集合)

[更新]

让我再添加一点作为对您的评论的回应。 根据我的经验,在分布式系统中原子地做事可以归结为:

  1. 总是以相同的顺序做事
  2. 使第二步项目具有潜力(确保您可以重复多次以得到相同的结果)
  3. 第一步成功-重复第二步,直到成功

因此,如果您要发送有关保存到cosmos db中的内容的电子邮件,可以:

  1. 将记录保存在cosmos数据库中
  2. 具有天蓝色功能来收听更改提要
  3. 一旦您收到插入的文档>发送电子邮件(更强大的解决方案实际上会将其放入队列,一些专门的消费者从中发送电子邮件)

另一种方法是将初始命令(保存记录)放入队列中,然后让2个使用者(一个用于保存,一个用于发送电子邮件),但是您会遇到订购问题(如果那对您很重要)。 / p>