JD.*_*JD. 4 masstransit nservicebus cqrs
最近6个月的学习曲线一直是挑战,CQRS和DDD是主要的罪魁祸首.
它很有趣,我们通过我们的项目是1/2,而我没有时间深入研究的领域是一个消息传递框架.
目前我没有使用DTC,所以如果我的阅读模型没有更新,那么就有很好的可能性,那么我将在读写数据库之间存在不一致.我的读写数据库也将在同一台机器上.我怀疑我们会把它们放在不同的机器上.
我的系统中没有大量的消息,因此我更关心的是系统的一致性和可靠性.
那么,我是否必须放入像NServiceBus这样的消息传递框架(即使读取和写入数据库都在同一台机器上),还是我还有其他选择?是的,有学习曲线,但我想如果我不使用它会有很多东西需要学习.
另外,如果没有必要,我不想放入图层
思考?
目前我没有使用DTC,所以如果我的阅读模型没有更新,那么就有很好的可能性,那么我将在读写数据库之间存在不一致.
就个人而言,我不喜欢DTC并试图避免它.相反,通常可以实现补偿机制,特别是对于像读取模型这样的东西,其中最终的一致性已经被接受并且更新是幂等的.例如,您可以在实体上实现版本并具有后台任务,以确保版本同步.拥有DTC将提供事务重试功能,但它仍然无法解决重试后发生故障的情况 - 您仍然必须查看错误日志并具有处理错误的过程.
那么,我是否必须放入像NServiceBus这样的消息传递框架(即使读取和写入数据库都在同一台机器上),还是我还有其他选择?
这取决于一些事情.您经常在CQRS系统中遇到的是pub/sub,其中多个子系统发布查询/缓存系统所订阅的事件.如果您发现需要pub/sub超越基本的点对点消息传递,那么请使用NServiceBus之类的东西.此外,即使您不需要它用于可伸缩性目的,我也不会立即回避使用NServiceBus,因为我认为逻辑分区本身是有益的.另一方面,正如您所指出的,添加复杂层是昂贵的,因此首先尝试查看最简单的事情是否有效.
另一个问题是你是否需要一个单独的查询存储.如果你拥有的只是一台机器,为什么还要费心呢?您可以使用比读取模型更简单的东西,并且仍然可以获得CQRS的许多好处.
CQRS项目是否需要像NServiceBus这样的消息传递框架?
简短的回答:没有.
这是我第一次听到eulerfx提到的"阅读模式模式".这是一个很好的名称,但还有一点:
"查询"部分背后的一般思想是查询数据的非规范化视图.在"读取模型模式"链接中,您会注意到用于填充读取模型的查询正在进行一些提升.在提到的例子所需要的数据操作不是那么复杂,但如果它确实变得更加复杂?这就是变性的来源.当您执行"命令"部分时,下一步操作是对数据进行非规范化并存储结果以便于阅读.所有繁重的工作都应由您的域名完成.
这就是您询问消息传递的原因.这里有几种技巧:
这是存储.一致性怎么样?:
最简单的解决方案(快速获胜)是在您的域中对数据进行非规范化,然后在通过存储库保存域对象后,立即将已脱机化的数据保存到同一个数据存储,相同的表,不同的列.100%一致,您可以立即开始读取非规范化数据.
如果你真的想要你可以创建一组单独的对象来传输那些数据,但是只需编写一个简单的查询层就可以更简单地返回一些由数据访问框架提供的数据承载对象(在.Net的情况下会是DataRow/ DataTable).绝对没有理由得到幻想.总会有例外,但您可以继续编写数据容器.
为了最终的一致性,您需要某种形式的排队和相关处理.您可以推出自己的解决方案,也可以选择服务总线.这取决于你和你的时间/技术限制:)
顺便说一句:我这里有免费的开源服务总线:
任何反馈都会受到欢迎.但任何旧的服务总线都会做(MassTransit/NServiceBus /等).
希望有所帮助.