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

时间:2017-01-20 10:16:26

标签: ruby-on-rails api asynchronous

我有一个Rails API,可以处理来自客户端的请求。客户端使用该API执行其数据分析。客户端将数据发布到API,API检查之前是否已分析过该数据。如果是这样,API只响应分析结果。如果在API之前尚未分析数据:

  1. 告诉客户分析已开始。

  2. 通过分析微服务建立连接。

  3. 对分析微服务执行异步(或延迟或不知道)请求并等待响应。分析需要花费很多时间,因此在执行时不应阻止API和微服务。

  4. 当返回分析微服务的响应时,API将其交给客户。

  5. 对我来说,主要问题是设置一些方式,客户端可以在执行请求后立即以某种方式收到“您的数据已被发送到分析”的消息。然后,当分析完成后,客户可以收到结果。

    问题是在这种情况下我必须采用什么方法?异步响应,延迟响应,还有其他什么?什么已知的解决方案可以帮助我?任何宝石?

    我是那些新手,所以如果我提出愚蠢的问题,我真的很抱歉。

2 个答案:

答案 0 :(得分:1)

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

如果您想通过HTTP构建异步API,首先应该做的事情是:接受请求,创建作业,在后台处理它并立即返回。

要让客户获得回复,您需要2个选项:

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

后台处理的一个良好开端是随Rails提供的sidekiq gem或更一般的ActiveJob

答案 1 :(得分:1)

如果使用HTTP,则每个请求只能有一个响应。要发送多个响应,即“正在进行中”,然后发送“结果”,您需要使用不同的协议,例如网络插座。

由于HTTP非常普遍,我会坚持将其与后台作业结合使用。我想到了几种选择。

  1. 轮询:API启动后台作业(调用微服务)并使用URL响应客户端,客户端可以定期ping该结果。 URL将以某种“正在进行中”状态响应,直到结果实际准备好)。该URL需要包含某种ID,以便API可以查找后台作业。
  2. API可能有两个URL; /api/jobs/new/api/jobs/<ID>。他们会在Rails中映射到一个控制器new并显示动作。

    1. Webhooks:客户端在请求中包含自己的URL。一旦结果可用,后台作业就会使用结果命中给定的URL。
    2. 无论哪种方式,如果使用HTTP,您将无法在请求/响应中处理整个事情,您将不得不使用某种后台处理(因此对微服务的请求发生在不同的进程中)。例如,你可以看看Sidekiq。

      以下是轮询的示例:

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

      1. 网络应用接收客户请求
      2. 为请求生成唯一ID,SecureRandom.uuid
      3. 启动后台作业(Sidekiq)传递uuid和所需的任何其他参数
      4. 使用例如example.com/api/jobs /
      5. 之类的网址回复

        -

        后台工作

        1. 向微服务API发送请求并等待响应
        2. 使用uuid
        3. 将结果保存到数据库

          -

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

          1. 在数据库中查找UUID,如果没有找到,则回复该作业“正在进行中”。如果发现在数据库中找到了返回结果。