如何组织微服务通信中的延迟结果处理?

时间:2020-01-27 14:57:43

标签: ruby-on-rails rest api microservices

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

每个Flask数据部分可能会影响多个Rails模型(UserPost等)。在这里,我面临两个问题:

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

1 个答案:

答案 0 :(得分: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。