我有一个Rails API,可以处理来自客户端的请求。客户端使用该API执行其数据分析。客户端将数据发布到API,API检查之前是否已分析过该数据。如果是这样,API只响应分析结果。如果在API之前尚未分析数据:
告诉客户分析已开始。
通过分析微服务建立连接。
对分析微服务执行异步(或延迟或不知道)请求并等待响应。分析需要花费很多时间,因此在执行时不应阻止API和微服务。
当返回分析微服务的响应时,API将其交给客户。
对我来说,主要问题是设置一些方式,客户端可以在执行请求后立即以某种方式收到“您的数据已被发送到分析”的消息。然后,当分析完成后,客户可以收到结果。
问题是在这种情况下我必须采用什么方法?异步响应,延迟响应,还有其他什么?什么已知的解决方案可以帮助我?任何宝石?
我是那些新手,所以如果我提出愚蠢的问题,我真的很抱歉。
答案 0 :(得分:1)
取决于您使用的API类型。我假设您的客户通过HTTP进行交互。
如果您想通过HTTP构建异步API,首先应该做的事情是:接受请求,创建作业,在后台处理它并立即返回。
要让客户获得回复,您需要2个选项:
后台处理的一个良好开端是随Rails提供的sidekiq gem或更一般的ActiveJob。
答案 1 :(得分:1)
如果使用HTTP,则每个请求只能有一个响应。要发送多个响应,即“正在进行中”,然后发送“结果”,您需要使用不同的协议,例如网络插座。
由于HTTP非常普遍,我会坚持将其与后台作业结合使用。我想到了几种选择。
API可能有两个URL; /api/jobs/new
和/api/jobs/<ID>
。他们会在Rails中映射到一个控制器new并显示动作。
无论哪种方式,如果使用HTTP,您将无法在请求/响应中处理整个事情,您将不得不使用某种后台处理(因此对微服务的请求发生在不同的进程中)。例如,你可以看看Sidekiq。
以下是轮询的示例:
网址:example.com/api/jobs/new
SecureRandom.uuid
。-
后台工作
-
网址:example.com/api/jobs/UUID