我正在寻求在Cosmos DB中实现对发件箱模式的支持。
但是,Cosmos DB似乎不支持跨馆藏的交易。
那我该怎么办?
我一直在考虑实现此目的的几种方法:
在Service bus transaction scope内,发送消息(尚未提交),进行Cosmos DB更新,如果可行,则我们进行服务总线事务以使消息可用于订阅者。
随着插入/更新的发生,我们使用Cosmos DB触发器将相应的消息插入发件箱表,此后一切照旧。
创建Azure functions as Cosmos DB triggers。我几乎喜欢这个,但是直接向服务总线发送消息要好得多。
添加两个字段UpdateTimestamp
和OutboxMessageTimestamp
。记录更新后,UpdateTimestamp
也将更新。
某些过程会查找这两个不匹配的记录,并为每个记录创建一条通知消息并将其中继到相应的队列或主题。
当然,然后它会更新第二个时间戳,以便它们匹配。
答案 0 :(得分:0)
通常,您将事物存储在cosmos db集合中。然后您有更改提要,将这些更改发送给某些观察者(比如说azure函数)。那么您的azure函数可以执行任何操作:将其放入其他使用者的队列中,保存到以其他方式投影的另一个集合中,依此类推...在您的azure函数中,您应该实现与函数运行时无关的失败的死信队列(例如,由于ID冲突而无法写入另一个集合)
[更新]
让我再添加一点作为对您的评论的回应。 根据我的经验,在分布式系统中原子地做事可以归结为:
因此,如果您要发送有关保存到cosmos db中的内容的电子邮件,可以:
另一种方法是将初始命令(保存记录)放入队列中,然后让2个使用者(一个用于保存,一个用于发送电子邮件),但是您会遇到订购问题(如果那对您很重要)。 / p>