首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >涉及多个微服务之间异步通信的用户界面和进程

涉及多个微服务之间异步通信的用户界面和进程
EN

Software Engineering用户
提问于 2016-09-08 11:23:34
回答 2查看 928关注 0票数 4

系统由多个微服务组成,每个微服务负责自己的上下文,如预订、支付、产品和通知。

让我们想象一下,我们有一个在网站上寻找住宿的旅行者。住宿是通过从产品微型服务中检索信息来列出的。旅行者找到了他想要的,于是决定预订。

他选择日期、晚上数、人等,并向预订微型服务提出请求.要求包含所有付款细节和预订细节。有趣的部分来了:

  1. 请求创建状态pending的预订记录,并发布事件reservation_created
  2. 为该事件创建支付服务池,创建信用卡授权,并在事件有效负载中发布带有预订ID的事件authorization_successfull
  3. 用于authorization_successful事件的产品微服务池,并检查是否确实可以在所请求的期间内提供住宿。如果一切正常,住宿将被标记为占用所需时间,并发布availability_updated事件。
  4. 预订微型服务将为该事件汇集,并将预订状态更改为approved,后者将发布新事件,因此通知微型服务可以为其汇集,并发送必要的电子邮件。

现在,我有几个问题:

  1. 从理论上看,这看起来不错,但我是让事情变得过于复杂了,还是这是实现脱钩的一种方式?
  2. 通过使用这种方法,我不能通知旅行者“预订完成”,因为在后台有一个很长的运行过程。我猜信息信息应该更像是“预订请求,您很快就会收到确认邮件,或者我应该将一个服务端点与加载屏幕,甚至使用web套接字发送回通知?”
EN

回答 2

Software Engineering用户

发布于 2016-09-08 15:50:06

首先思考:使内隐显化。旅行者为你提供了一个获得商业价值的机会;在这一点上,你绝对的首要任务是抓住这个机会--其他一切都可以等待。因此,您缺少了一个ReservationRequested事件;在您域的无处不在的语言中选择合适的拼写。

从理论上看,这看起来不错,但我是让事情变得过于复杂了,还是这是实现脱钩的一种方式?

在我看来,你好像走对了路。您可能需要检查您的设计,看看库存(可用性)是否与产品(营销、定价等)是一个独立的关注点。

通过使用这种方法,我不能通知旅行者“预订完成”,因为在后台有一个很长的运行过程。

这是正确的--但是,您应该在ReservationRequested事件中有足够的信息来知道哪个长期运行的后台进程将与该预订相关联(例如:进程id是根据保留请求中存在的值的哈希计算的)。

我倾向于通过将旅行者重定向到飞行过程的视图来实现ACK请求;如果他们在您取得任何进展之前遵循该链接,那么您将使用ReservationRequested事件来构建“我们收到了您的请求,您可以期望从……收到我们的请求”。消息,但该端点可用于在工作完成时提供流程的更新表示。

票数 4
EN

Software Engineering用户

发布于 2016-09-13 08:06:00

你的方向和设计看上去不错,有几点评论:

如果您可以让UI或API执行消息分发(而不是请求服务这样做),通过让每个业务组件完成它的工作并发布一个事件,这将减少耦合和更好的扩展机会。

您可以使用的另一种模式是Saga (状态机),这样您就可以更好地编排业务流程,并通过监听所有事件来了解您何时完成任务。

您可以查看一个佐贺在此实施示例

讲得通?

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/330508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档