【问题标题】:How do you get data from a reactive microservices system?您如何从反应式微服务系统中获取数据?
【发布时间】:2020-09-12 07:00:28
【问题描述】:

我正在设计一个反应式微服务系统,其中服务之间的通信——请求处理管道——是异步的(使用 kafka)。系统将管理虚拟机集群。平移以使用 Spring WebFlux 作为框架。

例如,创建新 VM 的请求可能如下所示:

  1. API 网关
  2. 安全验证
  3. 在用户空间创建虚拟机
  4. 为 VM 计划资源
  5. 成功/失败后向用户发送通知

感谢卡夫卡,所有步骤都是顺序的,但异步的。步骤由单独的微服务处理。

除此之外,客户端将(可能)想要发出 GET 请求,例如获取 VM 列表或有关集群状态的信息。我只是不知道怎么做。 我可以想到以下解决方案:

  1. 从 API 网关向其他服务发出(同步)GET 请求,聚合数据并返回。
  2. 向用户发出的通知已经包含所有必需的数据,因此我可以在专用服务中聚合所有用户可查询的数据(保存到数据库中)并从那里的 API 网关转发 GET 请求。

【问题讨论】:

    标签: asynchronous apache-kafka architecture microservices reactive-programming


    【解决方案1】:

    我实际上建议不要在这样的服务之间使用管道,而是有一个服务来管理这个 saga 并跟踪 saga 的状态。

    1. API 网关将请求转发到 saga 管理服务
    2. Saga 管理服务通知安全验证服务
    3. 安全验证服务发布事件
    4. 根据来自 3 的事件,saga 管理可能会通知 VM 创建服务
    5. VM 创建服务在用户空间创建 VM,发布事件
    6. 根据来自 5 的事件,saga 管理可能会通知资源调度服务
    7. 资源调度服务调度资源,发布事件
    8. 根据来自 7 的事件,saga 管理发送通知

    saga manager 可以响应故障(例如,如果资源无法调度,则通过回滚 VM 创建,或者通过戳服务以确定是否有必要考虑关闭它们)并有效地解释事物以发布额外丰富的事件以供其他人使用服务(例如,可以列出 VM 的服务可能对涉及 VM 创建和资源调度的事件感兴趣,而不仅仅是通知)并响应交互式请求。

    【讨论】:

    • 抱歉,回复晚了)您建议将 saga manager 作为协调器,但它真的需要吗?我可以只创建服务可以侦听和适当回滚的“失败”之类的 Kafka 主题吗?
    • 我猜你可以,但是你已经走上了让所有这些服务如此纠缠的道路,以至于你拥有一个分布式单体。
    • 同意。将阅读更深入的传奇故事,感谢您指点我!
    • 如何区分 choreographed-saga 和分布式单体?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2019-04-04
    • 1970-01-01
    • 2017-12-28
    • 2018-05-12
    • 2020-11-24
    • 2018-04-28
    相关资源
    最近更新 更多