CRM的架构选择

时间:2019-01-20 15:24:01

标签: .net-core domain-driven-design microservices crm cqrs

在开始开发CMS或CRM或ERP之前,我正在寻找一些架构选择的复杂性

我能够找到以下类似问题:A CRM architecture (open source app) 但是看起来已经够老了。

我最近观看并阅读了一些会议,讨论了整体与分布式,DDD原理,CQRS和事件驱动的设计等。 考虑到每个方面的缺陷(我认为),我对体系结构的选择感到比以前更加恐慌。

我发现所有可以在网上轻松找到的微服务和分布式系统的示例的不幸之处在于,它们总是以电子商务为例(客户,订单,产品...)。对于这种示例,存在多个数据库(通常是微服务提供的NoSQL DB)。 我看到了(或多或少)==>保持每种情况下必要数据的简约表示的优势。

但是如何去一个独特的关系数据库呢?我真的认为我需要一个单一的关系数据库,在一家生产CRM的公司工作(无法访问机器的源代码,但可以访问数据库的结构),所以我可以看到关系的重要性:清单,报告是必需的,并咨询CRM中实体之间的链接(联系人可以有多个公司,反之,每个用户都有多个动作,任务,但是他的每个任务也可以分配给其他用户,甚至可以链接到其他项目,例如:“ contact”,“ company”,“ publication”,“ calendarDate”等。每个表中可以有很多记录(+ 100,000行),因此索引的选择将非常重要,并且交易非常多-present,因为将有很多并发访问数据记录。

我对自己说的是,如果我选择使用微服务系统,那么将会有很多微服务要做,因为确实会有很多不同的环境,并且很有可能会产生大量的微服务。不同的领域模型。然后我最终有一种印象,那就是必须点亮花环的每个小灯泡,可能同时运行了太多的过程。

为了精确而不是四面八方,我有两个问题要问:

  1. 我们能轻松地将DDD原理与整体系统混合,同时解耦非常少的数量(出于各种原因,最终应绝对分开的最终服务)吗? 如果是这样,我可以要求提供一些资源以使我学到更多吗?
  2. 我们是否必须使用大量数据库,并且它是否一定是mongoDb,nosql类型? 我可以想象答案是否定的,但是我可以要求详细说明一下吗?还是将我重定向到可以给我足够清晰答案的文章?

提前谢谢!

(它将是.NET Core,草稿位于此处:https://github.com/Jin-K/simple-cms

1 个答案:

答案 0 :(得分:1)

DDD可以完美地用作设计CRM的一种方法。我在上一个项目(基于Web的CRM)中使用了它,而这正是我所需要的。事实上,如果我不使用DDD,那么就不可能进行管理。我创建的CRM(唯一的架构师和开发人员)非常复杂且非常自定义。它与许多外部系统(即电子邮件服务器和电话系统)集成。

您应该做的第一件事是发现系统的主要部分。这是最困难的部分,您可能会在第一时间弄错它们。好处是,这是一个迭代过程,应该在投入生产之前先稳定下来,因为这样一来,重构就比较困难(即您需要迁移数据,这很痛苦)。这些主要部分在DDD中称为有界上下文(BC)。

我为每个BC创建了一个模块。我不需要微服务,模块化的整体就是完美的。我用Conway's Law发现了BC。我注意到每个部门对CRM都有共同但又不同的需求。

每个部门都有一些通用的BC,例如电子邮件接收/发送,客户活动记录,任务计划,通知。所有部门的行为几乎都是相同的。

针对特定概念的部门特定BC的行为截然不同。例如,销售部门和数据处理部门对合同有不同的要求,因此我创建了两个名为Contract的聚合,它们共享相同的ID,但是它们具有其他数据+行为。为了使它们保持“同步”,我使用了Saga / Process Manager。例如,当激活合同时(手动或在第一次付款后),便创建了DataProcessingDocument,其中包含基于合同内容的数据。

另一重要观点是发现和尊重真理的来源。例如,接收到的电子邮件的真实来源是电子邮件服务器。 CRM应该在其UI中反映这一点,应该非常清楚,这只是对电子邮件服务器上发生的事情的延迟反映;由于技术原因,可能会收到未在CRM中显示的电子邮件。

电子邮件草稿的真实来源是CRM,它带有Email composer模块。如果草稿不再显示,则表示它已被CRM用户删除。

如果CRM不是事实的源头,那么代码应该几乎没有行为或完全没有行为,并且数据大部分应该是不可变的。在这里,您可能会有CRUD,除非您遇到性能问题(即数百万个条目),在这种情况下可以使用CQRS。

  

每个表中可以有很多记录(+ 100,000行),因此索引的选择将非常重要,并且事务是无处不在的,因为将有很多并发访问数据记录)。

CQRS帮助我建立了一个绩效+响应系统。您不必在每个模块上都使用它,而只是在您有大量数据和/或不同行为进行读写的地方。例如,为了记录与客户的活动,我使用了CQRS来列出绩效列表(因此出于性能原因,我使用了CQRS)。

我还使用了CQRS,对同一事件有很多不同的看法/看法/解释。

  

我们是否必须使用大量数据库,它是否必须是mongoDb,nosql类型?我可以想象答案是否定的,但是我可以要求详细说明一下吗?或将我重定向到可以给我足够清晰答案的文章

当然不是。使用任何有效的方法。我在95%的情况下使用MongoDB,而Mysql仅用于搜索模块。仅管理数据库系统更加容易,并且性能/可伸缩性/可用性足够好。

我希望这些想法对您有所帮助。祝你好运!