我有一个关于在CQRS体系结构上涉及多个聚合的投影的问题。
例如,假设我有两个聚合WorkItem
,Developer
并且以下事件顺序发生(但不是立即发生)
我希望创建一个作为developer-workitem的“内部连接”的投影:
| WorkItemId | DeveloperId | Title | DeveloperName | ... |
|------------|-------------|--------|---------------|-----|
| 1 | 1 | FixBug | John Doe | ... |
Run Code Online (Sandbox Code Playgroud)
我做预测的方式是逐步的。意思是我从数据库中加载保存的投影,并在剩余事件发生时应用它们。
我的问题是,负责在投影表上创建一行的事件是WorkItemAssigned
。但是,该事件不携带先前事件的必需信息(工作项标题,开发人员姓名等)。
为了及时获取所需的信息WorkItemAssigned
,我必须从事件存储中加载所有事件,将所有事件的状态保持在内存中WorkItems
,Developers
因此在WorkItemAssigned
事件到达时我具有所需的信息。
当然,我可以为Workitem
,另一个提供一个投影,Developer
并查询它们以检索其最后状态。但是似乎要进行很多工作,如果我要分别为每个聚合创建投影,那么我不妨创建一个数据库视图以内部联接它们(事实上,这就是我正在做的事情。)
我并没有手动完成所有操作,我目前正在使用一个名为EventFlow的良好框架,但是它并没有指导我回答这个问题。
这是关于CQRS基本原理的问题,我倒是在这里漏了一些东西。
我正在重构一个将进行大量计算的分析系统,我需要一些关于可能的架构设计的想法,以解决我面临的数据一致性问题.
当前架构
我有一个基于队列的系统,其中不同的请求应用程序创建最终由工作者使用的消息.
每个" 请求应用程序 "将大型计算细分为较小的部分,这些部分将被发送到队列并由工作人员处理.
当所有部分都完成后,原始的"请求应用程序"将合并结果.
此外,工作者使用来自集中式数据库(SQL Server)的信息来处理请求(重要:工作人员不会更改数据库上的任何数据,只会消耗它).
问题
好.到现在为止还挺好.当我们包含更新数据库信息的Web服务时,就会出现问题.这可能在任何时候发生,但至关重要的是,源自相同"请求应用程序"的每个"大计算"在数据库上看到相同的数据.
例如:
我不能让工人W2使用数据库的状态S1.为了使整个计算保持一致,它应该使用先前的S0状态.
思考
一种锁定模式,用于防止Web服务器在工作者消耗数据时更改数据库.
在数据库和worker(通过req.app控制db缓存的服务器)之间创建新层
我正在等待第二个解决方案,但对此并不十分自信.
有什么好主意吗?我设计错了,还是错过了什么?
OBS:
architecture sql-server distributed message-queue distributed-caching