如何将事件可靠地存储到Azure CosmosDB并一次准确地分派到事件网格

时间:2018-10-16 09:28:42

标签: azure azure-cosmosdb cqrs event-sourcing azure-eventgrid

我正在使用Azure中的无服务器体系结构尝试事件源/ cqrs模式。

我为事件存储和Azure事件网格选择了Cosmos DB文档数据库,用于将事件分配给非规范化器。

当事件存储在Cosmos DB中时,如何实现将事件可靠地一次可靠地传递到事件网格?我的意思是,如果无法传递到事件网格,则不应将其存储在事件存储中,对吗?

2 个答案:

答案 0 :(得分:3)

查看Cosmos Db Change Feed。为db中的每个更改内置事件引发器/队列。您可以注册一个或多个侦听器/处理程序。即Azure功能。

这可能正是您要的。

有人建议您可以直接转到cosmos db,并在changefeed的背面附加eventgrid。

答案 1 :(得分:2)

您不能但仍然不应该这样做。也许有一些使用分布式事务的非常复杂的方法,但是它们不可扩展。您无法原子地存储和发布事件,因为您正在写入具有不同事务边界的两个不同的持久性。您可以拥有一个同步的CQRS整体,但前提是您对事件持久性和readmodels持久性使用相同的技术。

在CQRS中,应用程序分为“写入/命令”和“读取/查询”两部分(this long video可能会有所帮助)。您试图将这两个部分统一为一个部分,如果可以的话,请降级。相反,您应该使用不同的模型分别对待它们(请参见Domain driven design)。

写方不应依赖于读方的结果。这意味着,在事件存储区保留事件之后,完成写端。另外,写端应包含完成其工作所需的所有数据,并根据业务规则发出事件。

如果在写入和读取部分中使用不同的技术,则您的读取端应与写入端分开,也就是说,它应在单独的线程/进程中运行。

一种方法是让线程/进程侦听事件存储的追加,获取新事件,然后将其发布到事件网格。如果此过程失败或重新启动,则应从上次中断的地方恢复。我不知道CosmosDB是否支持此功能,但是MongoDB(也是文档数据库)具有rslog,您可以tail在几毫秒内获取新事件。