背景:之前把系统里面一些长时任务迁出来让 resque 来异步执行
现象:resque task 进程需要独立装载 rails 整个应用,我的环境是内存有限的,本来用 puma 降低了对内存的消耗,现在由于 resque 的原因,内存消耗一下子增加了一倍
目前能想到的办法:让 resque 任务跑在一个 rails 线程里面,外部通过 http 或者其它接口来触发它启动或者关闭,但是这么做可能会带来线程冲突的复杂性,而且和 resque 的设计初衷不太相符,貌似不够优雅。
大家看看有没有好的建议,如果用我的办法,如何管理线程比较安全呢?
BTW:发现社区没有设计
节点,所以选了重构
可以尝试用纯 java server,一般都提供 background service,跑在两个 jruby runtime,不存在线程安全的问题,但是还是会有两个 rails instances 占用内存。
如果用 puma 的,可以尝试减少 resque worker 的数量,或者用 hoopo 提到的 sidekiq。
另外 resque+redis 本身是比较占内存的,可以考虑用 delayed_job 之类的。
@fsword 线程安全问题的确比较头疼,不知道是不是尝试过 passenger+ree,copy on write 的话,内存消耗应该不比多线程多,而且不用担心线程安全的问题
你这种需求用 Nodejs 或 Eventmachie/Thin 就比较好实现。 有耗时任务直接新建一个异步的 timer,既不消耗多余的内存,又不影响当前进程,缺点是未执行的任务在重启服务器的时候会丢失,还得去考虑一些持久化的事情。