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



以下示例:https://msdn.microsoft.com/en-us/library/jj591569.aspx(图3)

它如何适合http应用程序?

用户应该向PlaceOrderController执行一个http请求,它将发送一个PlaceOrderCommand,但是Order Process Manager将如何回答"9"?"订单确认"给用户?控制器如何意识到这一点,以便将此信息返回给用户?

谢谢

你根本没有立即回答"订单确认"。看看亚马逊和其他购物网站是怎么做的:在提交订单时,您只会收到一个"订单已接受确认"(例如,HTTP代码202已接受)。当订单流程管理器处理了实际订单后,将通过单独的消息/通道(例如,电子邮件)向用户发送"订单确认"通知。

@Hippoom为你指明正确的方向。

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

团队后来替换了这个机制来检查系统是否使用Post-Redirect-Get的实现保存订单模式。的新版本启动注册动作方法。有关的更多信息Post-Redirect-Get模式参见Post/Redirect/Get on文章维基百科。

[HttpPost]
public ActionResult StartRegistration(string conferenceCode,
OrderViewModel contentModel)
{
...
this.commandBus.Send(command);
return RedirectToAction(
"SpecifyRegistrantDetails",
new { conferenceCode = conferenceCode, orderId = command.Id });
}

操作方法现在重定向到specificyregistrantdetails视图在它发送命令之后。下面的代码示例显示了specificyregistrantdetails操作如何轮询订单返回视图之前的存储库。

[HttpGet]
public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId)
{
var draftOrder = this.WaitUntilUpdated(orderId);
...
}

第二种方法的优点,使用Post-Redirect-Get模式而不是在starregisterpost动作中与浏览器的前进和后退导航按钮配合得更好,它给出

这里我们讨论的是毫秒级的最终一致性,或者最坏的情况下是几秒级的一致性。所以p - r - g模式非常适合。

无论如何,你可以在这里和那里阅读有关最终一致性UI的文章,它们可以帮助你。

POST COMMENT EDIT:

Udi Dahan说:

什么时候应该避免使用CQRS?

答案是大多数时候。

这是我能给你的最强烈的暗示,让你知道你是正确执行CQRS:您的聚合根是传奇

所以,我认为你的问题不是发现CQRS如何为HTTP应用程序工作。您的问题是,对于您正在质疑的过程和用例,您应该避免使用CQRS。

您的Web/REST api独立于您的域模型,但根据您的用例和用户代理需求映射到它。一种方法是提交一个"作业",然后轮询该作业的进度。有许多权衡需要考虑。例如,根据您的基础结构,发送通知可能是最好的方法。如果你想要REST/HTTP,你可以试试这个:

用户代理:

POST /jobs/registrations
..content..

原始服务器:

HTTP/1.1 303 See Other
Location /jobs/registration/<some-job-id>

用户代理:

GET /jobs/registration/<some-job-id>
..content with job status..

最新更新