Ruby 一个拆分同步任务成 worker 的方案

linjunhalida · 2014年11月11日 · 最后由 linjunhalida 回复于 2014年11月11日 · 1839 次阅读

需求场景

有的时候需要做一些操作,用到了一些复杂的 gem,比如 pdf 处理,视频音频处理, 如果放到 rails 项目里面,项目就变得好大了,并且内存上面会不太可控。

考虑一个方案,可以采用以下的调用方式: 在 rails 里面使用: PdfWorker.process(filename) 然后里面会分配任务到另外的 worker。 和 resque 不一样的是,这个调用是同步的,类似 rpc:https://www.rabbitmq.com/tutorials/tutorial-six-ruby.html

考虑的解决方案

任务分发还是用 resque,sender 发送任务到一个 redis 队列。 worker 处理完之后,把数据塞到一个 hash map 之中,key 用一个随机生成的 id。 然后 sender 就阻塞监听结果是否生成。

问题

  • 错误处理:
    • worker 没有处理,sender 超时抛异常
    • hash map 爆了(比如很多 sender 都等不到结果出来就退出了),worker 需要清除旧数据
  • 性能:接收数据和处理数据都有时间差,可能有一定延时

请问大家这样的方案怎么样呀?

可以在 UI 上给到一下提醒吗?稍后在回来查看生成的 pdf 之类的

#1 楼 @jayliud UI 倒是小事,主要是看看这样的设计如何,是否有更好的选项?

3 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号