我正在尝试将我们的大球体系结构中的一些部分去耦,并确定了几个明显可以选择使用CQRS来提供更具弹性和可扩展性的解决方案的边界。
典型示例:当客户下订单时,我们在订单提交付款时被阻止他们的线程,由销售系统批准等等。
这可以全部异步处理 - 允许我们在付款处理系统不可用时接受和排队订单等等 - 但我不确定如何管理客户的UI数据。
换句话说 - 他们下订单。他们的订单排在队列中。如果他们在五秒钟后重新登录他们的帐户并点击“审核订单” - 会发生什么?
我想在很多地方这样做 - 而且并非所有这些行动都像确认订单一样重要;在某些情况下,它就像客户更改电话号码一样简单 - 所以他们并不是所有我只能说“非常感谢,我们会向您发送确认电子邮件”的情况 - 因为发送确认电子邮件每次修改记录的邮件都让我觉得有些过分。
我应该考虑哪些模式或解决方案来帮助解决这个问题?
答案 0 :(得分:5)
答案 1 :(得分:3)
最好的办法就是撒谎!
用户应该不知道他们的交易实际上有点像薛定谔的猫,无论是死还是活。从他们的角度来看,交易是成功的,因为你只是向他们表明它是成功的,并将工作排队等离线处理。
由于绝大多数交易都是成功的,因此您可以处理那些没有适当补偿机制的交易。
答案 2 :(得分:2)
不重要的案例,例如修改某些记录:
离线订单处理等重大案例:
您的域中可能存在已接收订单或待处理订单的隐含概念。如果您明确说明此概念,则可以向用户提供准确的信息。
“非常感谢!我们已收到您的订单,我们会在发货后随时更新。[点击此处]查看您的挂单清单......”
答案 3 :(得分:1)
我认为最简单的事情,什么都不做,往往足够好。如果用户更改了电话号码,并且系统在1-2s内处理此命令,则用户很可能无法在此操作之间查看旧数据。
如果不满意,并且您的用户必须完全知道他的请求已满足,您的UI可以订阅域事件。成功执行命令后,您的UI会收到通知并可以通知用户。您可以通过各种方式在UI中执行此操作。您可以直接阻止,直到成功通知到达。或者您可以说“我们已收到您的请求”,一旦您收到确认,请在角落的某个位置显示“您的请求已完成”的通知窗口。