Ruby 异步多服务器任务操作框架

linjunhalida · 2015年01月16日 · 最后由 linjunhalida 回复于 2015年01月16日 · 2678 次阅读

最近有一些需求,需要用到多服务器操作,它们的任务是依赖的。模拟场景:

我需要下载一批文件,这些文件只有翻墙才可以操作,并且文件需要进行一些预处理(音频或者视频转码),那么就要进行这样的操作:

  • 准备一个需要下载的文件列表
  • 操作:通知 digitalocean,创建服务器 1,服务器 2
  • 操作:服务器 1 获取一个文件列表,下载
  • 操作:服务器 2 从服务器 1 拷贝文件,格式转码
  • 操作:本地服务器从服务器 2 拷贝文件,通知我文件处理好了
  • 操作互相依赖,文件下载可以并行,如果其中出错,有错误日志

代码:

def download(url)
  server1 = create_or_get_server('download')
  server2 = create_or_get_server('convert')

  at server1 do
    filename = download(url)
  end

  at server2 do
    filename = copy(server1, filename)
    filename change_format(filename)
  end

  at server3 do
    filename = copy(server1, filename)
    remind_user(filename)
  end
end

请问有什么 ruby 框架支持这样的功能?谢谢!

Sidekiq , 不同的服务器上监听不同的任务队列,然后信息通过 redis 队列中的任务参数传过去 (尽量为字符串类型的参数).

这样,不同的 queue1 -> queue2 -> queue3 -> queue4 可以一次传递下去,并且可以在任何一个 queue 的环节控制是否往下一个 queue 中发任务或者向另外一个 queue 发任务。

#1 楼 @wppurking 我觉得这种模型不好,因为需要维护一个任务状态,操作流就变成了状态机,这样太复杂了,人需要能够理解在哪一步出现问题。还是操作流模型容易理解。这种模型中间出现了错误,就需要去查看状态,弄清楚这个状态的上下文,非常复杂。

应该有一个主控进程,每一个服务器操作异步等待,如果出现异常,直接抛出就好。类似操作系统进程模型,每个服务器操作类似一个异步 IO,主控进程阻塞等待。

@linjunhalida 我倒认为得看具体需要完成的任务情况了,如果在现有的模型下出现的问题,业务出现的问题的复杂程度是在能够接受的范围内,我到觉得是一个可行方案。另外对中间出现了错误查看中间状态的情况,同样可以有好的处理方法,(理想一点哈) 任何环节都可能出现问题,那你可以在任何环节针对出现的问题对任务回滚以及异常信息集中报告处理,让错误及早发现清空任务所有已做任务,让任务做到等幂性质可重复执行~ 这些都是可控的,当然也是有开发代价的。

拥有主进程控制的方法,让我想到类似 "microservices", 主方法不断的调用其他系统所提供的服务接口即可,出现问题各自服务记录 (可汇总到 airbrake 类似产品), 可同时返回错误信息主控制进程报告等等。

另外,主进程方法是否合适,还得考虑业务的忍受程度~ 总不能让这个主进程挂个 1 小时吧?这 1 小时带来的问题风险也不小呀?

@wppurking 挂太久就要考虑持久化的问题了。。

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