Jin*_*n-K 3 domain-driven-design crm cqrs microservices .net-core
在开始开发 CMS、CRM 或 ERP 之前,我正在寻找架构选择复杂性的一些线索。
我能够找到这个类似的问题:A CRM Architecture (open source app) 但它似乎足够老了。
我最近观看和阅读了一些会议,讨论了整体式与分布式、DDD 哲学、CQRS 和事件驱动设计等。在考虑到每个架构的缺陷(我认为)后,我对架构选择比以前更加恐慌。
我发现不幸的是,在网上可以轻松找到的所有微服务和分布式系统的示例中,它们总是以电子商务为例(客户、订单、产品......)。对于此类示例,存在多个数据库(通常是微服务的 NoSQL DB)。我看到了(或多或少)==> 为每个上下文保留必要数据的简约表示的优点。
但如何寻找一个独特的关系数据库呢?我真的认为我需要一个单一的关系数据库,在一家生产 CRM 的公司工作过(无法访问机器的源代码,但访问数据库的结构),我可以看到关系的重要性:对于列表、报告来说是必要的,并查阅 CRM 内实体之间的链接(一个联系人可以有多个公司,相反,每个用户有多个操作、任务,但他的每个任务也可以分配给其他用户,甚至链接到其他项目,例如:“联系人”、“公司”、“出版物”、“日历日期”等。而且每个表中可以有很多记录(+100,000行),所以索引的选择会相当重要,交易是全方位的-present 因为会有大量的并发访问数据记录)。
我对自己说的是,如果我选择使用微服务系统,将会有很多微服务要做,因为确实会有很多不同的上下文,并且很有可能拥有一堆不同的领域模型。然后我最终会有这样的印象:必须点亮花环的每个小灯泡,也许同时运行的进程太多。
为了尽量准确而不是全方位,我有两个问题要问:
先感谢您 !
(这将是.NET Core,草案在这里:https ://github.com/Jin-K/simple-cms )
DDD 作为设计 CRM 的一种方法非常有效。我在上一个项目(基于网络的 CRM)中使用了它,它正是我所需要的。事实上,如果我不使用DDD,那它就无法管理。我(唯一的架构师和开发人员)创建的 CRM 非常复杂且非常定制。它与许多外部系统集成(即电子邮件服务器和电话系统)。
您应该做的第一件事是发现系统的主要部分。这是最难的部分,你可能第一次就搞错了。好处是,这是一个迭代过程,应该在投入生产之前稳定下来,因为这样就很难重构(即您需要迁移数据,这很痛苦)。这些主要部分在 DDD 中称为有界上下文 (BC)。
对于每个 BC,我创建了一个模块。我不需要微服务,模块化整体架构就很完美。我用康威定律发现了BC。我注意到每个部门对 CRM 都有共同但又不同的需求。
每个部门都有一些通用的 BC,例如电子邮件接收/发送、客户活动记录、任务安排、通知。所有部门的行为几乎都是相同的。
对于相似的概念,部门特定的 BC 有非常不同的行为。例如,销售部门和数据处理部门对合同有不同的要求,因此我创建了两个名为Contract共享相同 ID 的聚合,但它们具有其他数据+行为。为了保持它们“同步”,我使用了 Saga/Process 管理器。例如,当合同被激活(手动或第一次付款后)时,DataProcessingDocument就会创建一个包含基于合同内容的数据的合同。
另一个重要的观点是发现并尊重真理的来源。例如,收到的电子邮件的真实来源是电子邮件服务器。CRM 应该在其 UI 中反映这一点,应该非常清楚,这只是电子邮件服务器上发生的情况的延迟反映;由于技术原因,可能会收到未在 CRM 中显示的电子邮件。
电子邮件草稿的真实来源是 CRM 及其Email composer模块。如果草稿不再显示,则表示它已被 CRM 用户删除。
当 CRM 不是事实来源时,代码应该很少或没有行为,并且数据应该大部分是不可变的。这里你可以使用 CRUD,除非你有性能问题(即数百万个条目),在这种情况下你可以使用 CQRS。
而且每个表中可以有很多记录(+ 100,000行),因此索引的选择将相当重要,并且事务无处不在,因为会有大量对数据记录的并发访问)。
CQRS 帮助我拥有了一个高性能+响应式的系统。您不必为每个模块使用它,只要有大量数据和/或不同的写入和读取行为即可。例如,为了记录与客户的活动,我使用 CQRS 来获得高性能列表(因此出于性能原因我使用了 CQRS)。
我还使用了 CQRS,对同一事件有很多不同的观点/预测/解释。
我们是否必须使用多种数据库,并且必须是 mongoDb、nosql 类型的数据库吗?我可以想象答案是否定的,但我可以要求详细说明一下吗?或者将我重定向到能给我足够清晰答案的文章
当然不是。使用任何有效的东西。我在 95% 的情况下使用 MongoDB,仅将 Mysql 用于搜索模块。仅管理数据库系统更容易,并且性能/可扩展性/可用性足够好。
我希望这些想法对你有帮助。祝你好运!
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |