Ruby on rails 如何在微服务通信中组织延迟结果处理?
我有以下系统:我的Rails服务器向Flask服务器发出命令,最新的服务器立即响应状态为200。之后,Flask服务器运行一个后台任务,其中包含一些耗时的功能。过了一会儿,它产生了一些结果,并被设计成通过HTTP将数据发送回Rails服务器(参见图) 每个烧瓶数据部分都会影响几个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的“延迟”数据部分 这是微服务通信的正常
User
,Post
等)。在这里,我面临两个问题:
这听起来很像您的标准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公开域对象(资源)和命名。