小编Max*_*Max的帖子

使用CQRS读取侧实现方法

我已经转移到积极使用CQRS +事件采购的项目.从第一眼就看出它是按照所有这些书籍和博客实现的,但最后我意识到实施中究竟是什么样的暴躁.

这是CQRS架构:CQRS设计

本来我从这里拍了这张照片.

正如我们在图片中看到的那样,读取端从队列接收事件并将其逐个传递到不同的投影集(非规范化器)中,然后通过AddOrUpdate方法将结果的ViewModel保存到DB中.因此我从图片中了解到,denormalizer只能依赖事件本身加上来自读取端db的数据.例如:

  1. 帐户视图已存储在数据库中.
  2. EmailChanged活动到来
  3. 我们从数据库中读取了帐户视图
  4. 应用电子邮件更改
  5. 我们将帐户保存回数据库.

另一个案例(计算一些项目的数量,说订单):

  1. OrderCreated事件到来
  2. 我们读取了ViewModel,它表示NumberOf以前到达的订单
  3. 增加并保存.

我们在项目中拥有的内容:我们仅将所有这些事件用作域模型中某些内容发生变化的通知程序.因此,我们做了什么:

  1. 我们使用域存储库并读取所有必需的聚合.这样做我们得到了它们的最新状态.
  2. 我们只是从头开始构建ViewModel对象
  3. 将新创建的对象保存到Db中

我们在项目中使用的方法对我来说有点奇怪,但我看不出它的所有缺点.如果我们需要重建我们的读取端,我们添加"active"denormalizer,并在下次收到特定事件时,重新创建新的viewmodel.

如果我们使用书中的方法,我将不得不在我的系统之外的某个地方有一个单独的utils逻辑用于重建.我们需要什么:

  1. 放下阅读面
  2. 从头开始阅读事件存储中的所有事件
  3. 将它们穿过投影

所以我的问题是:
这里的正确方法什么?

cqrs event-sourcing event-store

19
推荐指数
1
解决办法
5003
查看次数

一次构建,使用gitflow和gitversion部署许多

gitflow符合我们的需求,而giversion似乎也符合gitflow。但是有一件事我还不完全了解。让我解释一下困扰我的事情。

  1. 我们在开发分支上做了一些功能上的工作-所有软件包都标记为1.3.0-unstable.1、1.3.0-unstable.2,依此类推。
  2. 每个软件包都将通过管道-开发,测试,测试,生产。
  3. 因此,当开发人员准备就绪并且一切都很好时,根据gitflow我们启动了release分支。
  4. 发行时不需要做任何更改,我们会立即完成它-发行分支已合并到主版本和开发中。
  5. 构建服务器会再创建一个软件包1.3.0,该软件包已准备就绪。

如何实现一次构建,在这里部署多个?根据所有规则,我们需要将1.3.0-unstable.x升级到prod env,导致此软件包确实在dev和test中进行了测试,但是该版本对于prod看起来有点奇怪,不是吗?当来自master分支的1.3.0从未部署到任何地方时。

问题是这样的:在git flow模型中,我应该从master的merge提交构建到发布吗?

答案并不十分令人满意:

  1. 我们在与主人合并时不做-ff
  2. 还是一个不同的包裹

git git-flow gitversion

5
推荐指数
1
解决办法
985
查看次数

如果完全异步,我的任务是否长时间运行?

考虑这样的代码:

private static async Task ProcessSomethingAsync()
{
    while (true)
    {
        var message = await GetMessageAsync();
        await WriteAsync(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑GetMessageAsyncWriteAsync方法利用异步IO.

想象一下,我有几个(从2到N)这样的任务,只要应用程序存在就可以存活.在我看来,由于循环内的代码是完全异步的,所以最好不要在启动这些任务时使用LongRunning选项,这样我们就可以利用ThreadPool而不是为每个Task创建线程.

这是正确的还是我错过了什么?

.net c# multithreading task-parallel-library async-await

0
推荐指数
1
解决办法
345
查看次数