只是回顾一下我的计划,看看它是否可行。
我正在使用 RDBMS 并计划在没有事件源的情况下使用 CQRS。我认为事件溯源对于第一次尝试来说有点先进,我不得不使用 RDBMS。
基于任务的 UI 由许多命令组成,其中大多数不需要响应。
建筑基本上是
/---- RDBMS ( EF )
IO ops \
| \
Single threaded Domains Fascade(DTO) Queries
| /
Event/Command Dispatcher /
\ /
MVC client
单线程域不相互通信,它们通过中断器(基本上是环形缓冲区)与外界通信。
命令调度程序将外部事件和命令复制到磁盘并在崩溃时重新加载它们。完成被明确标记(通过 IO Ops)。
命令基本上将被持久化(具有命令的事务范围),IO Ops 层将抓取所有事件并处理它们,并在 1 个事务中标记命令完成。(请注意,该命令是通过日志服务而不是域持久化的,但它与 IO opps 对话,后者将其与命令的工作相匹配)。如果命令失败并且其标记为持续存在(并非所有都将持续存在),则可以重播它。(它只有在拥有命令并收到 DoTransation 消息时才会保留命令。)
命令调度程序通过中断器连接到域。
问题
我应该将整个域加载到内存中(大约 300 - 500 Meg)并运行吗?显然域只会在数据库更新后更新。
是否可以将外部事件混合回命令调度程序(因此它被单线程拾取并处理)。例如,事件变成命令。
对域和用户代码进行编码看起来很简单(而且我得到了一个很好的丰富域),至少从我正在研究的原型来看是这样。是吗?
当域进行 IO 时,它们会向破坏者发送消息,并且可以
- 指定命令 guid,命令与事务匹配
- 假设完成(射击和祈祷)
- 提供一个回调命令,该命令传递给命令调度程序,然后重新出现在域中。创建 IO 消息后,系统可以继续执行当前命令或完成它并接收下一个命令。
这够好吗?
系统运行在一个进程和共享内存中,但域资源只能由自己和1个线程访问。这个可以吗?
这是一个实验性的混合网格。有什么想法吗?