Domain driven design DDD/CQRS/ES使用图形数据库aka实现聚合成员,使用立即一致的readModel作为实体集合 摘要
我正在为我的应用程序建模一个通用授权子域。需求相当复杂,因为它需要处理多租户、分层组织结构、资源组、用户组、权限、用户可编辑权限等。它是RBAC(分配给角色的用户、拥有权限的角色、可以执行命令的权限)和基于声明的身份验证的混合体 问题 在检查业务规则不变量时,我必须遍历权限“图”,以找到用户对环境中的资源执行命令的权限。遍历深度在多个维度上是任意的 我可以使用代码对此进行建模,但最好使用图形数据库来表示,因为此聚合上的查询/更新会更快。此外,它还可以降低代码本身的复杂性。但这需要图形数据库立即保持一致 尽管如此,我仍然需要使用CQRS/ES,并启用分布式体系结构 因此,需要创建图形数据库Domain driven design DDD/CQRS/ES使用图形数据库aka实现聚合成员,使用立即一致的readModel作为实体集合 摘要,domain-driven-design,graph-databases,cqrs,event-sourcing,Domain Driven Design,Graph Databases,Cqrs,Event Sourcing,我正在为我的应用程序建模一个通用授权子域。需求相当复杂,因为它需要处理多租户、分层组织结构、资源组、用户组、权限、用户可编辑权限等。它是RBAC(分配给角色的用户、拥有权限的角色、可以执行命令的权限)和基于声明的身份验证的混合体 问题 在检查业务规则不变量时,我必须遍历权限“图”,以找到用户对环境中的资源执行命令的权限。遍历深度在多个维度上是任意的 我可以使用代码对此进行建模,但最好使用图形数据库来表示,因为此聚合上的查询/更新会更快。此外,它还可以降低代码本身的复杂性。但这需要图形数据库立即保
- 立即一致
- 从事件存储加载事件时,每次都必须重建图形数据库
- 或者,我们必须引入某种图形数据库快照
- 与图形数据库通信时的开销
- 降低了执行复杂查询的复杂性
- 解决复杂查询的速度比使用代码快
- 图形数据库非常适合这项工作
EntityList
实例或EntityHierarchy
实例。它们基本上是子实体的有序/分层集合。它们的实施是任意的。它们可以支持任何东西,从索引、键值对、动态数组等等,只要它们实现我为它们声明的接口。我甚至经常在这些实体(列表)上使用类似于findById()
或findByName()
的方法。这些方法类似于可以在数据库上执行的方法,但它们是在内存中执行的
因此,为什么不实现这样一个可以绑定到数据库的列表呢?例如,我没有使用TMemoryEntityList
,而是使用TMySQLEntityList
。在目前的情况下,可能需要一个TGraphAuthorizationScheme
的实现,它将位于TOrgAuthPolicy
集合中。只要它的行为像一个集合,并且它是可移植的,并且支持定义的接口
我正在Node.js上使用JavaScript构建我的应用程序。有一个在内存中实现的称为。也许我也可以用这个。但让我们继续
提议
我知道,在DDD术语中,基础设施不应该泄漏到域中。这就是我想要阻止的。这也是我问这个问题的原因之一,因为这是我第一次遇到这样的技术需求,我向那些习惯于处理这类问题的人寻求一些建议
集合的界面是IAuthorizationScheme
。实现必须支持深度遍历、授权查找等。这是我正在考虑通过使用图形数据库支持来实现的接口
顺序:
1当用户请求执行命令时,我首先对其进行身份验证。我找到他的组织,并要求OrgAuthPolicyRepository
加载其组织相应的OrgAuthPolicy
OrgAuthPolicyRepository
从EventStore
加载事件OrgAuthPolicyRepository
创建一个新的OrgAuthPolicy
,并注入一个依赖项TGraphAuthorizationScheme
实例OrgAuthPolicyRepository
将所有以前的事件应用于OrgAuthPolicy
,后者依次调用图形数据库上的查询,以将GraphDatabase
的状态与聚合同步IAuthorizationScheme
进行检查IAuthorizationScheme
的更改是否可以/希望使用外部数据库(例如图形数据库)来实现实体,从而使其实现更容易?如果有,是否有此类实施的示例或指南?如果不是,使用这样的技术有什么缺点? 为了解决你的任务,我会考虑下面的变型自上而下: