标签: dddd

使用Kafka作为(CQRS)Eventstore.好主意?

虽然我之前遇到过Kafka,但我最近才意识到Kafka可能会被用作CQRS,eventstore(的基础).

Kafka支持的要点之一:

  • 事件捕获/存储,当然都是HA.
  • 发布/子结构
  • 能够重放事件日志,允许新订户在事后注册系统.

诚然,我不是100%精通CQRS /事件采购,但这看起来非常接近eventstore应该是什么.有趣的是:我真的找不到关于Kafka被用作事件存储的那么多,所以也许我必须遗漏一些东西.

那么,卡夫卡缺少什么东西才能成为一个好的活动商店?会有用吗?用它生产?对洞察力,链接等感兴趣

基本上,系统的状态是根据系统收到的事务/事件保存的,而不是仅仅保存系统的当前状态/快照,这是通常所做的.(将其视为会计总帐:所有交易最终都会累加到最终状态)这允许各种很酷的事情,但只需阅读所提供的链接.

cqrs event-sourcing dddd apache-kafka

200
推荐指数
6
解决办法
5万
查看次数

Akka.Net VS MS奥尔良比较

我已经开始用CQRS/ES实现几个LOB应用程序并进行评估:

  1. 几个EMS:NServiceBus,MassTransit,RhinoMessageBus
  2. Akka.net + DDDD
  3. MS Orleans + DDDD

有很多不同EMS的比较,但没有对Actor框架的评估.

那么,请你比较Akka和奥尔良,即:

  • 特色礼物
  • 语法简洁(Akka是scala的逐行移植,因此它的架构可能不是最适合.net的)
  • 为工业发展做好准备(即任何非过度的错误,缺乏重要的功能等)
  • 发展速度与他们
  • 学习曲线(需要登录5-10个其他.net开发人员)
  • 有人试图让它在Mono或.Net Core上运行吗?(将通过Docker的Image部署到Linux)
  • 请分享您的想法,建议和直觉

c# cqrs dddd orleans akka.net

43
推荐指数
0
解决办法
1万
查看次数

替代与CQRS的多对多关系

我们如何使用CQRS/DDD模拟经典的多对多关系?

我知道DDD和CQRS实现和解决方案都倾向于特定于域,因此可能很难对这个问题提出一般性答案.

但是,我们假设我们在BookAuthor之间有熟悉的关系.这是一种经典的多对多关系.

对我来说,Book and Author似乎是两个不同的实体,每个实体都属于它们自己的Aggregate Root.因此,明确地模拟它们之间的多对多关系并不是一种可行的方法.

我们如何建模AddBookCommand?我们希望能够在我们的图书馆中添加一本书,并以某种方式说明某位作者撰写本书.我们如何建模(并坚持)这种关系?

无论是还是作者似乎是不错的候选值对象 ...

architecture domain-driven-design cqrs dddd

37
推荐指数
1
解决办法
3417
查看次数

命令和事件的命名约定

我刚刚进入事件驱动的体系结构,并想知道命名命令和事件的约定.我知道的很多:命令应该是DoSomething形式,而事件应该是SomethingHappened形式.我需要澄清的是,如果我需要在我的命令中附加"命令"一词,并在事件中添加"事件",例如DoSomethingCommand,而不仅仅是DoSomething和SomethingHappenedEvent,而不仅仅是SomethingHappened.我还想知道社区首选公约背后的理由是什么.谢谢!

domain-driven-design cqrs dddd

11
推荐指数
4
解决办法
5157
查看次数

我们可以一起使用REST + Event Sourcing + CQRS吗?

我了解REST +事件采购的基础知识.我从未使用过严格的RESTful API,也没有参与任何Event Sourcing项目.

有人可以解释两者是否可以一起使用?

在事件源中,客户端发送事件,这是否意味着在服务器上有一个事件集合,API的所有POST都将在该集合上,以向其添加事件?

客户端如何发现它可以发送到服务器的命令?

api rest domain-driven-design event-sourcing dddd

11
推荐指数
3
解决办法
5518
查看次数

DDDD:事件数据

我试图让我的头周围DDDD格雷格-年轻的风格.

关于如何使用CQRS + EventSourcing实现DDDD有很多话题,并且有一些示例实现......总而言之,它可能会令人困惑......

在Gregs视图中,聚合没有getter或setter - 只是发出相应事件的状态更改方法.

Basicly一个事件 decribes一个状态转换,在过去happend.它的数据描述了改变了什么.

有人说,这些数据可以通过其他数据" 丰富 ".
这些额外的数据可以来

即我有- User两个聚合根(可以独立存在,有身份).有一个叫做的方法.UsergroupUserAddToUsergroup

public class User : AggregateRoot
{
    // ...
    public void AddToUsergroup(Usergroup usergroup)
    {
        // validate state
        RaiseEvent(new UserJoinedUsergroup(this.Id, usergroup.Id));
    }
    // ...
}

public class Usergroup : AggregateRoot
{
    private string _displayName;
    // ...
    public void ChangeDisplayName(string displayName)
    {
        // validate state …
Run Code Online (Sandbox Code Playgroud)

domain-driven-design cqrs dddd

8
推荐指数
1
解决办法
798
查看次数

在CQRS中实现基于集合的约束

我仍然在努力解决与CQRS风格架构相关的基本(和解决)问题:

我们如何实现依赖于一组聚合根的业务规则?

以一个预订申请为例.它可以让您预订音乐会的门票,电影的座位或餐厅的桌子.在所有情况下,只有有限数量的"物品"可供出售.

让我们想象一下这个活动或地点非常受欢迎.当销售为新事件或时段开放时,预订开始很快到达 - 可能每秒很多.

在查询方面,我们可以进行大规模扩展,并将预留放在队列中以由自治组件异步处理.首先,当我们从队列中取出预约命令时,我们将接受它们,但在某个时间我们将不得不开始拒绝其余的.

我们怎么知道什么时候达到极限?

对于每个预约命令,我们必须查询某种商店以确定我们是否可以容纳请求.这意味着我们需要知道当时已收到多少预订.

但是,如果域存储是非关系数据存储,例如Windows Azure表存储,我们就不能很好地做到 SELECT COUNT(*) FROM ...

一种选择是保持一个单独的聚合根,它只是跟踪当前的计数,如下所示:

  • AR:预订(谁?多少?)
  • AR:事件/时间段/日期(总计数)

第二个聚合根将是第一个聚合根的非规范化聚合,但是当底层数据存储不支持事务时,它们很可能在高容量场景中不同步(这是我们正在尝试的首先解决).

一种可能的解决方案是序列化预留命令的处理,以便一次只处理一个,但这违背了我们的可扩展性(和冗余)目标.

这种情况让我想起了标准的"缺货"情景,但不同之处在于我们不能很好地将预订放在后面.一旦活动售罄,它就卖光了,所以我看不出补偿行动会是什么.

我们如何处理这种情况?

azure cqrs azure-table-storage dddd

7
推荐指数
1
解决办法
1140
查看次数

CQRS +事件采购:(这是正确的)命令通常是点对点通信,而域事件是通过pub/sub传递的吗?

不知道如何缩短那个头衔.

我基本上试图围绕CQRS(http://en.wikipedia.org/wiki/Command-query_separation)和相关概念的概念.

虽然CQRS不一定包含消息传递和事件源,但它似乎是一个很好的组合(可以看到很多结合这些概念的示例/博客)

给出状态变化的用例(例如更新SO上的问题),您是否会认为以下流程是正确的(如最佳实践)?

  • 系统发出一个聚合UpdateQuestionCommand,它可能被分成几个较小的命令:UpdateQuestion,它针对Question Aggregate Root,以及UpdateUserAction(计算点数等),针对User Aggregate Root.这些是使用点对点消息传递异步发送的.

  • 聚合根完成他们的事情,如果一切顺利,火灾事件QuestionUpdated和UserActionUpdated分别包含外包到事件存储的状态..要保持yadayada,只是为了完整,这不是真正的重点.

  • 这些事件也被放在发布/子队列中进行广播.任何订阅者(其中可能有一个或多个创建读取视图的投影仪)都可以自由订阅这些事件.

一般问题:确实是最佳实践,命令是点对点通信(即:接收器是已知的)而广播事件(即:接收器是未知的)?

假设如上所述,允许通过pub/sub而不是点对点广播命令的优点/缺点是什么?

例如:在使用Saga(http://blog.jonathanoliver.com/2010/09/cqrs-sagas-with-event-sourcing-part-i-of-ii/)播放命令时可能会出现问题,因为佐贺需要在其中一个聚合根失败的情况下发挥调解作用,因为传奇不知道哪个聚合根开始参与.

另一方面,我看到允许广播命令的优点(灵活性).

任何帮助清理头脑的人都非常感谢.

publish-subscribe cqrs event-sourcing dddd

6
推荐指数
1
解决办法
1539
查看次数

分布式领域驱动设计资源

我对开发DDD应用程序非常有信心,但是一个继续引起我问题的领域是两个应用程序相互集成.我正在努力寻找关于这个主题的任何有用的书籍或资源.像EAI模式这样的书籍深入探讨了消息传递模式和消息构建,但并没有真正解释如何构建利用这些模式的系统.

我搜索过高和低,我很确定没有示例应用程序可以说明如何集成两个系统.我理解异步消息传递的概念,但再次找不到如何应用它的好例子.

SOA上的资源似乎不重复相同的概念,而没有演示如何实现它们,而且往往更关心的是销售我的产品.

以下是我正在努力回答的问题:

  1. 每个应用程序是否应该拥有自己的数据副本?例如,组织中的每个应用程序是否都有自己的客户端列表,并在收到消息后更新?

  2. 在DDD堆栈中的什么时候传递消息?它们是域事件的结果吗?

  3. 我可以组合异步消息传递和WCF,还是我必须选择?我是否将WCF用于发布/订阅的请求/响应和消息传递?

  4. 一个DDD应用程序如何使用另一个应用程序的服务?一个DDD应用程序是应该通过其应用程序服务查询另一个系统的数据,还是应该已经拥有自己的数据本地副本,如第1点所述?

  5. 显然我不能跨两个系统进行交易.我该如何避免这种情况?

如果我听起来很困惑,那是因为我.我不是在寻找上述问题的答案,只是指出将回答这个和类似问题的资源方向.

messaging soa distributed domain-driven-design dddd

5
推荐指数
1
解决办法
1905
查看次数

与 DDD + CRQS + ES 的并发

我研究 DDD 一段时间了,并偶然发现了 CQRS 和事件溯源 (ES) 等设计模式。这些模式可用于帮助以更少的努力实现 DDD 的某些概念。

\n\n

然后我开始开发一个简单的软件来实现所有这些概念。并开始想象可能的失败路径。

\n\n

为了阐明我的架构,下图描述了来自前端并到达后端控制器的一个请求(为简单起见,我忽略了所有过滤器、绑定器)。

\n\n

时序图

\n\n
    \n
  1. 演员发送一张表格,其中包含他想从一个账户提取的金额。
  2. \n
  3. 控制器将视图模型传递到应用层,在应用层将其转换为一个命令
  4. \n
  5. 应用层打开一个工作单元(UOW)将VM映射到命令并将命令发送到调度程序。
  6. \n
  7. 调度程序找到知道如何处理命令(帐户)的相应聚合类,并向工厂请求帐户的特定实例。
  8. \n
  9. 工厂创建一个新的帐户实例并从事件存储中请求所有事件。
  10. \n
  11. 事件存储返回帐户的所有事件。
  12. \n
  13. 工厂将所有事件发送到聚合,以便其内部状态正确。并返回帐户的实例。
  14. \n
  15. 调度程序将命令发送到帐户,以便可以对其进行处理。
  16. \n
  17. 帐户检查是否有足够的资金进行提款。如果有,它会发送一个新事件“MoneyWithdrawnEvent”。
  18. \n
  19. 此事件由更改其内部状态的聚合(帐户)处理。
  20. \n
  21. 应用程序层关闭 UOW,当关闭时,UOW 检查所有加载的聚合,以检查它们是否有新事件要保存到事件存储中。如果有,它将事件发送到存储库。
  22. \n
  23. 存储库将事件保存到事件存储中。
  24. \n
\n\n

可以添加很多层,例如:聚合缓存、事件缓存、快照等。

\n\n

有时ES可以与关系数据库并行使用。这样,当 UOW 保存已发生的新事件时,它还会将聚合持久保存到关系数据库中。

\n\n

ES 的好处之一是它拥有一个中心事实来源,即事件存储。因此,即使内存中甚至关系数据库中的模型被损坏,我们也可以从事件中重建模型。

\n\n

有了这个事实来源,我们就可以构建其他系统,这些系统可以以不同的方式使用事件来形成不同的模型。

\n\n

然而,要实现这一点,我们需要真相来源干净且未被损坏。否则所有这些好处都不会存在。

\n\n

也就是说,如果我们考虑图中描述的架构中的并发性,可能会出现一些问题:

\n\n
    \n
  • 如果actor在一个排序周期内向后端发送两次表单,并且后端启动两个线程(每个请求一个),那么它们将调用两次应用层,并启动两个UOW,依此类推。这可能会导致两个事件存储在事件存储中。
  • \n
\n\n

这个问题可以在很多不同的地方处理:

\n\n
    \n
  1. 前端可以控制哪个用户/演员可以执行什么操作以及执行多少次。

  2. \n
  3. 调度程序可以拥有正在处理的所有命令的一个缓存,如果存在引用同一聚合(帐户)的命令,则会抛出异常。

  4. \n
  5. 存储库可以创建聚合的新实例,并在保存之前运行事件存储中的所有事件,以检查版本是否仍与步骤 7 中获取的版本相同。

  6. \n
\n\n

每个解决方案的问题:

\n\n
    \n
  1. 前端

    \n\n
      \n …

architecture domain-driven-design cqrs event-sourcing dddd

5
推荐指数
1
解决办法
2395
查看次数

聚合根中覆盖的实体如何保存在 DDD 中?

在阅读了大量帖子后,我意识到如果一个概念/上下文存在聚合根,我们需要为整个概念/上下文创建一个存储库。

如果是这样,我看到内部实体不会有任何存储库。如果是这样,这些内部实体如何保存到数据库中?

我在聚合根下有许多内部实体。所以,想知道如果我需要在聚合根存储库下保存所有内部实体,它会变得臃肿。请建议在这种情况下可以做什么。

此外,我的内部实体将在持久性级别转到他们自己的每个表。如果我不允许以这种方式存储内部实体,请纠正我。

示例
考虑我有一个 Restaurant 作为聚合根。它可以对名为 Review 的实体进行分组。餐厅存在评论,没有它就无法存在。

在这里,如果 Review 是一个内部实体,并且一个餐厅可以有很多评论,Reviews 将保存在一个单独的表中。但是由于餐厅聚合根只有一个餐厅存储库,因此如何/在何处处理保存评论。

domain-driven-design aggregate ddd-repositories aggregateroot dddd

3
推荐指数
3
解决办法
1316
查看次数

使用Application Service和Manager的目的是什么?

我不是一个经验丰富的程序员.我总是浏览源代码来学习一些东西.ASP.NET Boilerplate是我最喜欢的.昨天,我注意到友情应用服务(在服务/应用层)和友情管理器(在业务/域层).我不明白为什么有友谊经理.友谊服务还不够?

public interface IFriendshipAppService : IApplicationService
{
    Task<FriendDto> CreateFriendshipRequest(CreateFriendshipRequestInput input);

    Task<FriendDto> CreateFriendshipRequestByUserName(CreateFriendshipRequestByUserNameInput input);

    void BlockUser(BlockUserInput input);

    void UnblockUser(UnblockUserInput input);

    void AcceptFriendshipRequest(AcceptFriendshipRequestInput input);
}
Run Code Online (Sandbox Code Playgroud)
public interface IFriendshipManager : IDomainService
{
    void CreateFriendship(Friendship friendship);

    void UpdateFriendship(Friendship friendship);

    Friendship GetFriendshipOrNull(UserIdentifier user, UserIdentifier probableFriend);

    void BanFriend(UserIdentifier userIdentifier, UserIdentifier probableFriend);

    void AcceptFriendshipRequest(UserIdentifier userIdentifier, UserIdentifier probableFriend);
}
Run Code Online (Sandbox Code Playgroud)

asp.net domain-driven-design application-design dddd aspnetboilerplate

2
推荐指数
1
解决办法
137
查看次数

CQRS命令作为POST操作的模型

我开始使用CQRS,并认为在我的表单上使用Command对象作为模型是最有意义的.我可以利用DataAnnotations,客户端验证的命令的一些客户端验证,使它非常干净...

我的问题......这会引起任何问题吗?如果我的命令没有默认构造函数,这会使这个过程变得不可能吗?我是否需要创建自己的CommandModelBinder,构造函数可以注入聚合ID?

你的想法,我无法在任何地方找到这种技术,我假设因为它不起作用.

cqrs dddd asp.net-mvc-3

1
推荐指数
1
解决办法
1341
查看次数