我已经转移到积极使用CQRS +事件采购的项目.从第一眼就看出它是按照所有这些书籍和博客实现的,但最后我意识到实施中究竟是什么样的暴躁.
这是CQRS架构:
本来我从这里拍了这张照片.
正如我们在图片中看到的那样,读取端从队列接收事件并将其逐个传递到不同的投影集(非规范化器)中,然后通过AddOrUpdate方法将结果的ViewModel保存到DB中.因此我从图片中了解到,denormalizer只能依赖事件本身加上来自读取端db的数据.例如:
另一个案例(计算一些项目的数量,说订单):
我们在项目中拥有的内容:我们仅将所有这些事件用作域模型中某些内容发生变化的通知程序.因此,我们做了什么:
我们在项目中使用的方法对我来说有点奇怪,但我看不出它的所有缺点.如果我们需要重建我们的读取端,我们添加"active"denormalizer,并在下次收到特定事件时,重新创建新的viewmodel.
如果我们使用书中的方法,我将不得不在我的系统之外的某个地方有一个单独的utils逻辑用于重建.我们需要什么:
所以我的问题是:
这里的正确方法是什么?
gitflow符合我们的需求,而giversion似乎也符合gitflow。但是有一件事我还不完全了解。让我解释一下困扰我的事情。
如何实现一次构建,在这里部署多个?根据所有规则,我们需要将1.3.0-unstable.x升级到prod env,导致此软件包确实在dev和test中进行了测试,但是该版本对于prod看起来有点奇怪,不是吗?当来自master分支的1.3.0从未部署到任何地方时。
问题是这样的:在git flow模型中,我应该从master的merge提交构建到发布吗?
答案并不十分令人满意:
考虑这样的代码:
private static async Task ProcessSomethingAsync()
{
while (true)
{
var message = await GetMessageAsync();
await WriteAsync(message);
}
}
Run Code Online (Sandbox Code Playgroud)
考虑GetMessageAsync和WriteAsync方法利用异步IO.
想象一下,我有几个(从2到N)这样的任务,只要应用程序存在就可以存活.在我看来,由于循环内的代码是完全异步的,所以最好不要在启动这些任务时使用LongRunning选项,这样我们就可以利用ThreadPool而不是为每个Task创建线程.
这是正确的还是我错过了什么?