我必须设计一个连接到WCF服务的客户端系统,以对数据库执行读写操作,并获得通知。
我被告知使用CQRS模式。
为了举例,客户将连接到服务以执行获取产品列表和更新产品等操作。他们还可以执行诸如接受装运和拒绝装运之类的操作(这可能会导致首先执行此操作的客户之间的竞争)。只有一个客户可以“接受”货物或“拒绝”货物。
所以我读了一些关于CQRS的内容并理解它将读取与写入分离(使用命令)。但是,如果我使用CQRS,我不确定几个主要问题:
如果我在WCF服务上使用CQRS模式 - 我可以依靠数据库中同步的事情吗?我有点困惑,因为我不希望服务是单线程的(以支持未来的可伸缩性),但另一方面 - 我如何确保对服务的写操作以正确的顺序执行?甚至阅读操作? CQRS模式是否保证有序处理? (有人告诉我here CQRS模式使用“更新”队列更新离线处理请求。)
使用CQRS会消除并发问题吗?
我是否仍然在与数据库交互的所有命令处理程序中使用“TransactionScope”?
我花了一个多星期的时间试图了解如何为客户实施通知服务,没有运气。我有design:design http://s16.postimage.org/aqakx6j9f/asdf.png
'产品服务'将是CQRS服务,但我在通知服务方面遇到问题。客户端可以向产品服务发送命令以通知类别X的产品。该命令将更新数据库中的请求。我们现在说通知服务每15分钟轮询一次数据库,并检查哪个用户想要在哪个类别上进行轮询,然后将新产品发送给请求在这些产品类别上通知的用户。 如果用户更改了产品的类别,而其他20个用户已在其通知窗口中看到此产品,现在会发生什么? 我需要一些方法来检测产品不再属于该类别,并向他们发送通知,例如'从您的视图中移除该产品'。 这听起来不像通知。这听起来更像是“请求数据库表的常量相关视图,并且每个更改都应反映到客户端的屏幕”。 我该如何做这种通知服务?
答案 0 :(得分:2)
这可能不是您具体问题的答案,但可能有助于评估您是否可以(或可能应该)使用CQRS的应用程序是否,为什么以及在哪些部分?
更具体地说:CQRS既不是应该应用的银弹,也不是整个应用程序中的总体架构风格。
当应用于单个且指定良好的有界上下文时,CQRS可以提供许多优势(参见Eric Evans的Domain Driven Design)。
您或您的团队应首先询问的问题:
长话短说:不要试图强调整个应用程序的风格。确定BC并为每种用途提供满足要求的最简单的解决方案。这很可能是CQRS,但对于您的应用程序中最多只有一个或两个BC。
如果使用CQRS进行形式化和实施,那么将精力集中在应用程序中最复杂的部分和将提供真正的优势。
答案 1 :(得分:0)