Ruby on rails 如何在微服务通信中组织延迟结果处理?

Ruby on rails 如何在微服务通信中组织延迟结果处理?,ruby-on-rails,rest,api,microservices,Ruby On Rails,Rest,Api,Microservices,我有以下系统:我的Rails服务器向Flask服务器发出命令,最新的服务器立即响应状态为200。之后,Flask服务器运行一个后台任务,其中包含一些耗时的功能。过了一会儿,它产生了一些结果,并被设计成通过HTTP将数据发送回Rails服务器(参见图) 每个烧瓶数据部分都会影响几个Rails模型(User,Post等)。在这里,我面临两个问题: 在这种情况下,我应该如何在Rails端构建控制器/操作?目前,我考虑一个控制器,它的每个动作都对应于Python的“延迟”数据部分 这是微服务通信的正常

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

每个烧瓶数据部分都会影响几个Rails模型(
User
Post
等)。在这里,我面临两个问题:

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

  • 这听起来很像您的标准webhook过程。Rails通过GET或POST请求戳入烧瓶,烧瓶在一段时间后戳回

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

    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。

    我喜欢将
    回调url
    作为参数传递的想法,但在这种情况下,如果
    验证
    操作不仅应该更新报告,而且应该更新用户的统计数据,等等。我应该把动作放在哪里。我如何命名这个控制器?我怎么知道?除了这个问题中模糊的细节,我什么都不知道。你是你的域的主人-弄清楚它。试着把它想象成一系列restful端点,你的Rails应用程序向CRUD公开域对象(资源)和命名。