我正在寻找将具有明确域模型的相对较新的基于Web的应用程序转换为更多CQRS样式系统。我的新应用程序本质上是对现有旧系统的强化替代。
我组织中的现有系统共享一组公共数据库,这些数据库由遍布公司的孤岛中的无数应用程序(通过混沌方法开发)进行更新。 (按照目前的情况,我相信公司中没有一个人可以识别所有人。)
因此我的问题是关于我的应用程序的读取模型。由于各种状态更改,一般用户数据等由我控制之外的其他应用程序更新,处理构建读取模型的最佳方法是什么,以便我可以处理外部更新,但仍然保持相对简单?< / p>
到目前为止,我已经考虑了以下内容:
关于如何处理此事的一般共识是什么?认为如果不从头开始完全重写所有内容,我可以为遗留系统带来秩序,这是愚蠢的吗?
答案 0 :(得分:1)
我已成功使用选项#1。根据写入数据库的复杂性,创建视图以使数据士气低落以创建读取模型是可行的选择。意思是,如果它是大多数开发人员可以理解的相对简单的连接,那么我会仔细研究一下它是否适合你。我会小心这些观点过于复杂。
要考虑的另一件事是定期轮询以构建和更新类似于传统的报告数据库。虽然与通知相比不是最佳的,但根据您的阅读模型的陈旧程度,这也可能是一个选项。
答案 1 :(得分:1)
我曾经处于类似的情况,以下步骤是我如何做到的:
要改进遗留系统并实现更清晰的代码库,关键是接管写入责任。但不要过于雄心勃勃,因为这可能会引入接口/合同变更,这使得最终部署风险很大。
如果所有写入都是通过除直接sql更新之外的任何内容触发的,请尽可能向后兼容。将它们作为新开发的命令处理程序的适配器/客户端。
部分写入是直接的sql更新,但不受你的控制
询问负责团队是否可以更改您的新界面/合同?
如果不是,请参阅步骤3.
询问他们是否可以容忍最终的一致性,并愿意用数据库程序替换sql更新? 如果是,请将所有sql更新放入过程并安排部署并查看步骤4 如果不是,也许你应该将它们包含在你的重构中。
修改过程,用插入事件替换sql更新。并开发后端工作来滚动事件并发布它们。让新应用程序订阅这些事件以向命令处理程序发出命令。
从命令处理程序中发出事件,并使用它们来更新其他应用程序过去使用的表。
转到旧系统的下一部分。
答案 2 :(得分:0)
如果我们拥有一台无限强大的服务器,我们就不会为视图模型烦恼,而只会从基本实体表中读取。视图模型旨在通过准备和维护适当的数据集进行显示来提高性能。如果您使用数据库视图作为视图模型,那么对于特殊查询,您实际上没有获得太多的性能提升(如果您忽略了sql解析器可以为视图执行的预先计划)。
我成功使用的解决方案比@ Hippoom的解决方案更具侵入性,但比@ Derek更具响应性。如果您可以访问旧系统并且可以进行少量代码更改,则可以添加异步队列写入以在遗留系统存储库中的队列系统(RabbitMQ,Kafka或其他)中生成事件,或者在数据持久存储的任何位置生成事件。使这些写入异步不应该引入任何显着的性能成本,并且如果队列写入失败,它将不会影响遗留系统。这种变化也很容易通过质量保证。
然后编写一个事件驱动的片段来更新您的阅读模型。在遗留系统更新阶段(可能需要一段时间),或者如果您只能访问写入这些数据库的某些遗留系统,您可以使用一个小实用程序来放置一个新的&#34; UpdateViewModel&#34;每隔几分钟在队列中发生一次事件。然后,当遗留系统保存重要内容时,您将获得及时的事件,但是对于您无法更新的系统也是如此。