首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails API、微服务、异步/延迟响应

Rails API、微服务、异步/延迟响应
EN

Stack Overflow用户
提问于 2017-01-20 10:16:26
回答 2查看 1K关注 0票数 0

我有一个Rails API,它可以处理来自客户端的请求。客户端使用该API来执行数据分析。客户端将数据发布到API,API检查这些数据是否曾经被分析过。如果是这样的话,API只需响应分析结果。如果在API之前还没有对数据进行分析:

  1. 告诉客户分析开始了。
  2. 建立与分析微服务的联系。
  3. 对分析微服务执行异步(或延迟或不知道)请求并等待响应。分析需要很长时间,所以在进行分析时不应该阻塞API和微服务。
  4. 返回来自分析微服务的响应时,API将其交给客户端。

对我来说,主要的问题是设置这样的方式,使客户端在执行请求后就可以以某种方式接收“您的数据已被发送到分析”的消息。然后,当分析完成时,客户就可以得到它的结果。

问题是,在这种情况下,我必须采取什么方法?异步响应,延迟响应,其他什么?有什么已知的解决办法能帮到我吗?有宝石吗?

我对这件事不熟悉,所以如果我问了些愚蠢的问题,我真的很抱歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-20 10:35:03

如果使用HTTP,则只能对每个请求有一个响应。要发送多个响应,即“正在进行中的工作”,然后再发送“结果”,您需要使用不同的协议,例如web套接字。

由于HTTP非常常见,所以我会将其与后台作业结合使用。有几种选择在脑海中浮现。

  1. 轮询: API启动后台作业(调用微服务),并使用URL响应客户端,客户端可以定期为结果进行切换。URL将以某种“正在进行的工作”状态进行响应,直到结果实际就绪为止)。URL需要包含某种id,以便API可以查找后台作业。

API可能有两个URLS:/api/jobs/new/api/jobs/<ID>。在Rails中,它们将映射到一个新的控制器并显示动作。

  1. Webhooks:让客户端在请求中包含自己的URL。一旦结果可用,让后台作业与结果一起点击给定的URL。

无论哪种方式,如果使用HTTP,您将无法在请求/响应中处理整个事件,您将不得不使用某种背景处理(因此,对微服务的请求发生在不同的进程中)。例如,你可以看看Sidekiq。

下面是一个轮询示例:

网址: example.com/api/jobs/new

  1. web应用程序接收客户端请求
  2. 为请求SecureRandom.uuid生成唯一的id。
  3. 启动后台作业(Sidekiq),传入uuid和所需的任何其他参数。
  4. 使用URL响应,如example.com/api/jobs/

--

背景作业

  1. 向microservice API发送请求并等待响应。
  2. 用uuid将结果保存到数据库

--

网址: example.com/api/jobs/UUID

  1. 在数据库中查找UUID,如果没有找到,则响应该作业“正在进行”。如果找到返回结果,请在数据库中找到。
票数 1
EN

Stack Overflow用户

发布于 2017-01-20 10:34:40

取决于您使用的API类型。我假设您的客户通过HTTP进行交互。

如果您想要在HTTP上构建一个异步API,首先要做的事情是:接受请求,创建一个作业,在后台处理它,然后立即返回。

要使客户端获得响应,您必须选择两个选项:

  • 实现一个状态端点,其中客户端可以定期轮询作业的状态。
  • 通过webhooks实现回调。因此,客户端必须提供一个URL,然后在您完成之后调用该URL。

背景处理的一个良好开端是Rails附带的侧方宝石或更通用的ActiveJob

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41761120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档