它是一个合理的权衡使用`sleep`异步工作吗?

问题描述 投票:0回答:2

假设我有我在哪里加工的工人后台作业的情景。它只是接受一个网址给文件(图片,视频,PDF,..)托管在远程CDN和工人做的工作是:

  1. 在内存中的文件内容进行一些处理
  2. 然后调用第三方API来检索a signed valid URL上传内容到同一个第三方。
  3. 将内容上载到第三方API - 响应包含一个唯一的ID文件
  4. 通过第三方API Sends a message to a user具有独特的文件ID较早接收

现在,问题是步骤(3)和(4)之间。这里的约束是第三方API需要几秒钟就可以处理文件(步骤3)之前,我们实际上是发送一个包含我们刚刚上传的文件ID(步骤4)的消息。

这里还有一个假设是,我需要确保所有4个步骤执行一气呵成,如,不要有任何部分失败的机会。

可能的方法

  • 最简单的方式去是使用sleep 5步骤(3)和(4),这可能会伤害/硬故障,因为我不完全知道有多少秒没有第三方API需要处理之间,但根据我的考验, 5秒睡眠似乎是正常的。
  • 我可以做一个进程指数重试为第3步(或X)时间(3),捕捉来自第三方的异常并尝试执行步骤(4)在步骤(3)成功 - 这就是我现在,它的工作原理没有问题。
  • 我也许可以要么使用作业调度或红宝石并发库(4)延迟的方式做一步。因为这感觉就像是有利于复杂,我不明白这条路。

这件作品的逻辑是建立在Ruby中,虽然这个问题可能不是很红宝石特有的,可以适用于其他语言,我想听听Ruby的人认为。

ruby concurrency jobs worker distributed-system
2个回答
1
投票

您所连结的API docs地说:

注意!由一台服务器需要一些时间来处理上传的文件。文件应短暂停后发送到聊天(几秒钟)

我通常会建议对这种性质的东西,但因为你的供应商明确表示,“超时”,sleep是最好的选择。


0
投票

我想尝试做延迟的任务,因为这将允许线程继续工作(因此线程池将不再需要创建新的线程(它们是从内存方面相当昂贵),你的线程可以继续,而不需要上下文切换的执行有用的工作(这是由CPU使用侧昂贵),...)。

至于溶液纯度,异步编程应该不涉及任何阻塞的任务(我们实际上是在对抗使用异步编程拦截),所以这是一个更有理由使用延迟任务。

如果申请不涉及实现最高性能(不红宝石业绩为导向的语言?),所以睡眠可能真的是最简单的,但不是最优化的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.