虽然我之前遇到过Kafka,但我最近才意识到Kafka可能会被用作CQRS,eventstore(的基础).
Kafka支持的要点之一:
诚然,我不是100%精通CQRS /事件采购,但这看起来非常接近eventstore应该是什么.有趣的是:我真的找不到关于Kafka被用作事件存储的那么多,所以也许我必须遗漏一些东西.
那么,卡夫卡缺少什么东西才能成为一个好的活动商店?会有用吗?用它生产?对洞察力,链接等感兴趣
基本上,系统的状态是根据系统收到的事务/事件保存的,而不是仅仅保存系统的当前状态/快照,这是通常所做的.(将其视为会计总帐:所有交易最终都会累加到最终状态)这允许各种很酷的事情,但只需阅读所提供的链接.
我已经开始用CQRS/ES实现几个LOB应用程序并进行评估:
有很多不同EMS的比较,但没有对Actor框架的评估.
那么,请你比较Akka和奥尔良,即:
我们如何使用CQRS/DDD模拟经典的多对多关系?
我知道DDD和CQRS实现和解决方案都倾向于特定于域,因此可能很难对这个问题提出一般性答案.
但是,我们假设我们在Book和Author之间有熟悉的关系.这是一种经典的多对多关系.
对我来说,Book and Author似乎是两个不同的实体,每个实体都属于它们自己的Aggregate Root.因此,明确地模拟它们之间的多对多关系并不是一种可行的方法.
我们如何建模AddBookCommand?我们希望能够在我们的图书馆中添加一本书,并以某种方式说明某位作者撰写本书.我们如何建模(并坚持)这种关系?
无论是书还是作者似乎是不错的候选值对象 ...
我刚刚进入事件驱动的体系结构,并想知道命名命令和事件的约定.我知道的很多:命令应该是DoSomething形式,而事件应该是SomethingHappened形式.我需要澄清的是,如果我需要在我的命令中附加"命令"一词,并在事件中添加"事件",例如DoSomethingCommand,而不仅仅是DoSomething和SomethingHappenedEvent,而不仅仅是SomethingHappened.我还想知道社区首选公约背后的理由是什么.谢谢!
我了解REST +事件采购的基础知识.我从未使用过严格的RESTful API,也没有参与任何Event Sourcing项目.
有人可以解释两者是否可以一起使用?
在事件源中,客户端发送事件,这是否意味着在服务器上有一个事件集合,API的所有POST都将在该集合上,以向其添加事件?
客户端如何发现它可以发送到服务器的命令?
我试图让我的头周围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) 我仍然在努力解决与CQRS风格架构相关的基本(和解决)问题:
我们如何实现依赖于一组聚合根的业务规则?
以一个预订申请为例.它可以让您预订音乐会的门票,电影的座位或餐厅的桌子.在所有情况下,只有有限数量的"物品"可供出售.
让我们想象一下这个活动或地点非常受欢迎.当销售为新事件或时段开放时,预订开始很快到达 - 可能每秒很多.
在查询方面,我们可以进行大规模扩展,并将预留放在队列中以由自治组件异步处理.首先,当我们从队列中取出预约命令时,我们将接受它们,但在某个时间我们将不得不开始拒绝其余的.
我们怎么知道什么时候达到极限?
对于每个预约命令,我们必须查询某种商店以确定我们是否可以容纳请求.这意味着我们需要知道当时已收到多少预订.
但是,如果域存储是非关系数据存储,例如Windows Azure表存储,我们就不能很好地做到 SELECT COUNT(*) FROM ...
一种选择是保持一个单独的聚合根,它只是跟踪当前的计数,如下所示:
第二个聚合根将是第一个聚合根的非规范化聚合,但是当底层数据存储不支持事务时,它们很可能在高容量场景中不同步(这是我们正在尝试的首先解决).
一种可能的解决方案是序列化预留命令的处理,以便一次只处理一个,但这违背了我们的可扩展性(和冗余)目标.
这种情况让我想起了标准的"缺货"情景,但不同之处在于我们不能很好地将预订放在后面.一旦活动售罄,它就卖光了,所以我看不出补偿行动会是什么.
我们如何处理这种情况?
不知道如何缩短那个头衔.
我基本上试图围绕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/)播放命令时可能会出现问题,因为佐贺需要在其中一个聚合根失败的情况下发挥调解作用,因为传奇不知道哪个聚合根开始参与.
另一方面,我看到允许广播命令的优点(灵活性).
任何帮助清理头脑的人都非常感谢.
我对开发DDD应用程序非常有信心,但是一个继续引起我问题的领域是两个应用程序相互集成.我正在努力寻找关于这个主题的任何有用的书籍或资源.像EAI模式这样的书籍深入探讨了消息传递模式和消息构建,但并没有真正解释如何构建利用这些模式的系统.
我搜索过高和低,我很确定没有示例应用程序可以说明如何集成两个系统.我理解异步消息传递的概念,但再次找不到如何应用它的好例子.
SOA上的资源似乎不重复相同的概念,而没有演示如何实现它们,而且往往更关心的是销售我的产品.
以下是我正在努力回答的问题:
每个应用程序是否应该拥有自己的数据副本?例如,组织中的每个应用程序是否都有自己的客户端列表,并在收到消息后更新?
在DDD堆栈中的什么时候传递消息?它们是域事件的结果吗?
我可以组合异步消息传递和WCF,还是我必须选择?我是否将WCF用于发布/订阅的请求/响应和消息传递?
一个DDD应用程序如何使用另一个应用程序的服务?一个DDD应用程序是应该通过其应用程序服务查询另一个系统的数据,还是应该已经拥有自己的数据本地副本,如第1点所述?
显然我不能跨两个系统进行交易.我该如何避免这种情况?
如果我听起来很困惑,那是因为我.我不是在寻找上述问题的答案,只是指出将回答这个和类似问题的资源方向.
我研究 DDD 一段时间了,并偶然发现了 CQRS 和事件溯源 (ES) 等设计模式。这些模式可用于帮助以更少的努力实现 DDD 的某些概念。
\n\n然后我开始开发一个简单的软件来实现所有这些概念。并开始想象可能的失败路径。
\n\n为了阐明我的架构,下图描述了来自前端并到达后端控制器的一个请求(为简单起见,我忽略了所有过滤器、绑定器)。
\n\n\n\n可以添加很多层,例如:聚合缓存、事件缓存、快照等。
\n\n有时ES可以与关系数据库并行使用。这样,当 UOW 保存已发生的新事件时,它还会将聚合持久保存到关系数据库中。
\n\nES 的好处之一是它拥有一个中心事实来源,即事件存储。因此,即使内存中甚至关系数据库中的模型被损坏,我们也可以从事件中重建模型。
\n\n有了这个事实来源,我们就可以构建其他系统,这些系统可以以不同的方式使用事件来形成不同的模型。
\n\n然而,要实现这一点,我们需要真相来源干净且未被损坏。否则所有这些好处都不会存在。
\n\n也就是说,如果我们考虑图中描述的架构中的并发性,可能会出现一些问题:
\n\n这个问题可以在很多不同的地方处理:
\n\n前端可以控制哪个用户/演员可以执行什么操作以及执行多少次。
调度程序可以拥有正在处理的所有命令的一个缓存,如果存在引用同一聚合(帐户)的命令,则会抛出异常。
存储库可以创建聚合的新实例,并在保存之前运行事件存储中的所有事件,以检查版本是否仍与步骤 7 中获取的版本相同。
每个解决方案的问题:
\n\n前端
\n\n在阅读了大量帖子后,我意识到如果一个概念/上下文存在聚合根,我们需要为整个概念/上下文创建一个存储库。
如果是这样,我看到内部实体不会有任何存储库。如果是这样,这些内部实体如何保存到数据库中?
我在聚合根下有许多内部实体。所以,想知道如果我需要在聚合根存储库下保存所有内部实体,它会变得臃肿。请建议在这种情况下可以做什么。
此外,我的内部实体将在持久性级别转到他们自己的每个表。如果我不允许以这种方式存储内部实体,请纠正我。
示例
考虑我有一个 Restaurant 作为聚合根。它可以对名为 Review 的实体进行分组。餐厅存在评论,没有它就无法存在。
在这里,如果 Review 是一个内部实体,并且一个餐厅可以有很多评论,Reviews 将保存在一个单独的表中。但是由于餐厅聚合根只有一个餐厅存储库,因此如何/在何处处理保存评论。
domain-driven-design aggregate ddd-repositories aggregateroot dddd
我不是一个经验丰富的程序员.我总是浏览源代码来学习一些东西.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
我开始使用CQRS,并认为在我的表单上使用Command对象作为模型是最有意义的.我可以利用DataAnnotations,客户端验证的命令的一些客户端验证,使它非常干净...
我的问题......这会引起任何问题吗?如果我的命令没有默认构造函数,这会使这个过程变得不可能吗?我是否需要创建自己的CommandModelBinder,构造函数可以注入聚合ID?
你的想法,我无法在任何地方找到这种技术,我假设因为它不起作用.
dddd ×13
cqrs ×9
architecture ×2
aggregate ×1
akka.net ×1
apache-kafka ×1
api ×1
asp.net ×1
azure ×1
c# ×1
distributed ×1
messaging ×1
orleans ×1
rest ×1
soa ×1