Domain driven design 在CQRS http应用程序中实现Saga/Process Manager

Domain driven design 在CQRS http应用程序中实现Saga/Process Manager,domain-driven-design,process-management,saga,Domain Driven Design,Process Management,Saga,以下示例:(图3) 它如何适应http应用程序 用户应向PlaceOrderController执行http请求,后者将发送PlaceOrderCommand,但订单流程管理器如何向用户回答“9.订单已确认”?为了将此信息返回给用户,控制器如何意识到这一点 谢谢您不必立即回答“订单已确认”。看看亚马逊和其他购物网站是如何做到这一点的:在提交订单时,您只会收到一个“订单接受确认”(例如,HTTP代码202已接受)。当订单流程管理器处理了实际订单时,在单独的消息/通道(例如,电子邮件)上会收到一个“

以下示例:(图3)

它如何适应http应用程序

用户应向PlaceOrderController执行http请求,后者将发送PlaceOrderCommand,但订单流程管理器如何向用户回答“9.订单已确认”?为了将此信息返回给用户,控制器如何意识到这一点


谢谢

您不必立即回答“订单已确认”。看看亚马逊和其他购物网站是如何做到这一点的:在提交订单时,您只会收到一个“订单接受确认”(例如,HTTP代码202已接受)。当订单流程管理器处理了实际订单时,在单独的消息/通道(例如,电子邮件)上会收到一个“订单确认”通知发送给用户。

@Hippoom为您指明了正确的方向

CQRS之旅(你在读什么)说:

该团队后来更换了该机制,以检查系统是否 使用Post重定向Get的实现保存订单 下面的代码示例显示了 StartRegistration操作方法。有关 Post重定向获取模式请参阅上的文章 维基百科

[HttpPost]
public ActionResult StartRegistration(string conferenceCode,
OrderViewModel contentModel)
{
...
this.commandBus.Send(command);
return RedirectToAction(
"SpecifyRegistrantDetails",
new { conferenceCode = conferenceCode, orderId = command.Id });
}
操作方法现在重定向到SpecificRegistrantDetails视图 在它发送命令之后 显示SpecificRegistrantDetails操作如何轮询中的订单 返回视图之前,请先删除存储库

[HttpGet]
public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId)
{
var draftOrder = this.WaitUntilUpdated(orderId);
...
}
第二种方法的优点是使用Post重定向Get 而不是在StartRegistration post操作中的模式是 使用浏览器的前进和后退导航按钮可以更好地工作, 而且它给


这里我们讨论的是在最坏的情况下毫秒或几秒钟的最终一致性,所以p-R-G模式非常适合

无论如何,在那里你可以阅读关于最终一致性UI的文章

评论后编辑:

尤迪·达汉说:

什么时候应该避免CQR

答案是大部分时间

这是我能给你的最有力的暗示,让你知道你 正确地做CQR:你的聚合根是传奇


因此,我认为您的问题不在于发现CQR如何为HTTP应用程序工作。您的问题在于,对于您正在询问的流程和用例,您应该避免CQR。

您的Web/REST api独立于您的域模型,但根据您的用例和用户代理需求映射到它。一种方法是提交“作业”“然后调查工作进展情况。有许多权衡要考虑。例如,根据您的基础结构,发送通知可能是最好的方式。如果需要REST/HTTP,可以尝试以下方法:

用户代理:

POST /jobs/registrations
..content..
GET /jobs/registration/<some-job-id>
..content with job status..
源服务器:

HTTP/1.1 303 See Other
Location /jobs/registration/<some-job-id>
HTTP/1.1 303参见其他 地点/工作/注册/ 用户代理:

POST /jobs/registrations
..content..
GET /jobs/registration/<some-job-id>
..content with job status..
GET/jobs/registration/
…满足于工作状态。。

在网络上如何显示“您的购买成功”的信息/@fj123x可能通过发送电子邮件或页面轮询后端,或通过websocketpolling发送消息在哪里?一个充当“收件箱”的控制器,以便在上一个http请求之前获取所有消息?(在第一个请求中等待流程管理器完成是否正确?)“这里我们讨论的是在最坏的情况下毫秒或几秒钟的最终一致性。因此P-R-G模式非常适合。”好的,所以:1。您提交订单(P)2。你重定向到g3。如果订单还没有被确认(因为第三方的延迟,不管怎样),那么你应该重复R(重定向到G)直到有结果吗?如果你想要立即响应,你应该考虑同步命令处理。否则,请使用某种异步通知系统(如StackOverflow上的消息通知)。在cqrs/es应用程序中,同步命令处理是否正确?我读了之后,他们说“如果您的用户必须等待视图模型更新才能看到他们的结果,那么您构建了错误的用户界面。结果应该是即时的。您是否收到了我的命令?是或否?我的命令的状态如何?这是您应该进行的交互。”他们说没有。顺便说一句:有些情况下,这些信息是不能伪造的(比如“旋转获胜,等等”)