0

我希望在 Cosmos DB 中实现对发件箱模式的支持。

但是,Cosmos DB 似乎不支持跨集合的事务。

那我该怎么做呢?

我一直在考虑一些方法来实现这一点:

使用服务总线事务

服务总线事务范围内,发送消息(尚未提交),进行 Cosmos DB 更新,如果它有效,那么我们提交服务总线事务以使消息对订阅者可用。

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

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

使用触发器执行 azure 函数

创建Azure 函数作为 Cosmos DB 触发器。我几乎喜欢这个,但直接向服务总线发送消息会更好。

使用数据泵

添加两个字段UpdateTimestampOutboxMessageTimestamp. 当记录更新时,UpdateTimestamp.

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

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

关于如何做到这一点的其他想法?

4

1 回答 1

1

通常,您将内容存储在 cosmos db 集合中。然后你有更改源将这些更改发送给一些观察者(比如说天蓝色函数)。那么你的天蓝色函数可以做任何事情:将它放入队列以供其他消费者使用,保存到另一个以不同方式投影的集合中,等等......在你的天蓝色函数中,你应该为与函数运行时无关的故障实现死信队列(例如,由于 id 冲突,写入另一个集合失败)

[更新]

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

  1. 总是按相同的顺序做事
  2. 使第二步 itempotent(确保您可以重复多次获得相同的结果)
  3. 一旦第一步成功 - 重复第二步直到成功

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

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

替代方法是将初始命令(保存记录)放入队列,然后有 2 个消费者(一个用于保存,一个用于发送电子邮件),但随后您会遇到订购问题(如果这对您很重要)。

于 2019-07-16T09:26:51.177 回答