【问题标题】:How to organize delayed results processing in microservices communication?微服务通信中如何组织延迟结果处理?
【发布时间】:2020-01-28 21:45:30
【问题描述】:

我有以下系统:我的 Rails 服务器向 Flask 服务器发出命令,最新的一个立即响应状态为 200。之后 Flask 服务器运行一个具有一些耗时功能的后台任务。过了一会儿,它产生了一些结果,旨在通过 HTTP 将数据发送回 Rails 服务器(见图)

每个 Flask 数据部分都会影响多个 Rails 模型(UserPost 等...)。在这里我遇到了两个问题:

  1. 在这种情况下,我应该如何在 Rails 端构建我的控制器/操作?目前,我考虑的是一个控制器,它的每个操作都对应于 Python 的“延迟”数据部分。
  2. 是微服务通信的正常方式吗?或者我可以用一种不同的、更简单的方式来组织它?

【问题讨论】:

    标签: ruby-on-rails rest api microservices


    【解决方案1】:

    这听起来很像您的标准 webhook 过程。 Rails 用 GET 或 POST 请求戳 Flask,过一会儿 Flask 又戳回来。

    例如,假设我们有报告,在创建报告后,我们需要烧瓶来验证报告:

    class ReportsController
      # POST /reports
      def create
        @report = Report.new(report_params)
        if @report.save
          FlaskClient.new.verify(report) # this could be delegated to a background job
          redirect_to @report
        else
          render :new
        end
      end
    
      # PATCH /reports/:id/verify
      def verify
        # process request from flask
      end
    end
    
    class FlaskClient
      include Httparty
    
      base_uri 'example.com/api'
      format 'json'
    
      def verify(report)
        self.class.post('/somepath', data: { id: report.id, callback_url: "/reports/#{report.id}/verify", ... })
      end
    end
    

    当然,Rails 应用程序实际上并不知道 Flask 何时会响应,或者 Flask 和后台服务不同。它只是发送和响应http请求。而且您绝对不希望 rails 等待,因此请保存您拥有的内容,然后钩子可以更新数据。

    如果您必须在 Rails 端更新 UI 而无需用户手动刷新,您可以使用 ActionCable 形式的轮询或 websocket。

    【讨论】:

    • 我喜欢将callback_url 作为参数传递的想法
    • 但是在这种情况下,如果您的verify 操作不仅应该更新报告,还应该更新用户、他的统计信息等,我应该将操作放在哪里。我该如何命名这个控制器?
    • 我应该怎么知道?除了这个问题中模糊的细节,我什么都不知道。你是你的领域的主人 - 弄清楚。
    • 试着把它想象成你的 Rails 应用程序向 CRUD 公开域对象(资源)的一系列安静的端点,命名自然而然。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2019-09-28
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多