在我的项目中,我使用业务层的存储库模式。读了很多关于存储库模式的文章,我还没有发现任何关于如何使业务对象与数据同步的信息。
假设我已经加载了一些数据,通过映射创建了我的业务对象并将它们保存到存储库中。我的存储库实现维护更改跟踪,这样我就可以轻松地更新底层数据层。
该应用程序是n层应用程序,具有多个客户端,并且(可能)在不同的独立服务器上有多个业务层实例。
问题:
如何保持存储库中业务对象和数据库中相应数据之间的数据一致性?
在何时以及如何更新业务对象方面,是否有任何模式或最佳实践?这些业务对象的数据在存储库中缓存时在数据库中发生了更改?
当一次处理一个聚合根(AR)时,事情很简单,因为存储库应该在事务(或提交)中封装任何重新分配给该AR的东西。问题是在处理多个AR和/或持久性不支持事务时。
对于这种情况,解决方案有点棘手,因为它涉及到最终一致性的概念(也就是说,事情最终会一致…)、消息驱动架构、传奇和幂等性。
简而言之,一个Ar被更新,从而生成一个或多个事件。其他AR订阅这些事件并更新它们的状态以及生成其他事件。基础设施,即本例中的消息总线,将确保每个事件至少在发布一次。事情可能会出错,但消息总线最终会传递消息(但不完全在同一毫秒内)。
事件处理程序幂等性确保操作可以在不更改初始结果的情况下重复,而saga则管理事件流和possbile命令(作为事件的结果)。
因此,所有涉及的业务对象最终都将同步,但实现这一点需要一点时间(从1毫秒到几分钟甚至几小时)。
它并不简单明了,但也没有那么难,而且在本地和分布式场景中都很有用。
对于分布式应用程序,您可以使用NServiceBus