重构 讨论一个设计方案

fsword · 2012年09月13日 · 最后由 fsword 回复于 2012年09月14日 · 4190 次阅读

背景:之前把系统里面一些长时任务迁出来让 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 之类的。

直接用消息队列多好,要深度整合 rails 的话,后台进程再请求 http rest 接口

#1 楼 @hooopo 正在看,还没看出有啥用处 #2 楼 @flyerhzm 现在我的系统已经不是 jruby based 了,改造成本有点高。另外你说的 resque+redis 占内存是指任务占了 redis 的内存吧,这个问题不大,我放在 redis 里面的东西很少

#3 楼 @yield 这就是我说的方式,只不过我不确定有没有 best practise

队列用 gearmand 试试?

我建议是花点钱再加点内存,硬件比人工便宜啊,而且以后维护也简单。

#2 楼 @flyerhzm 你也在这里玩耍啊 最近 torque box 玩的很开心么

Delayed Job 虽然老,但工作起来没什么问题。因为是用后端数据库作为集成点,可以另开 Server 只 run workers, 指向同一个数据库,不占用 web 的内存

#4 楼 @fsword sidekiq 号称是内存效率高,我还没有机会用,但估计网上会有人做过 benchmark

#7 楼 @quakewang 这个绝对同意

现在我的那些项目的队列都换成 Sidekiq 了

Sidekiq + 1,代码上只需要改动一点点即可。

既然都用 puma 了。直接 Thread.new 跑也没问题吧。或者自己声明一个线程池。就不需要载入环境多次了。

Java 多年没这个东西不也过来了么。

#7 楼 @quakewang 当然加内存是王道,我只是希望考虑这以外的可能性 #8 楼 @knwang #9 楼 @huacnlee #10 楼 @_samqiu Sidekiq 似乎帮不了我,主要是队列处理时需要业务模型的逻辑,所以要装载 rails 环境,这个是内存大头 #11 楼 @Saito 这个倒是也想过,不过 rails based 项目是否线程安全我现在不敢下结论,怕万一搞出问题检查都很费劲

#12 楼 @fsword Web 用 PHP,队列用 gearmand,后台用 Perl。应该能把内存省下来了...

#13 楼 @bhuztez 其实我倒是想过仅装载业务模型部分,只是模型层也有三方库,或者有什么地方可以查到 gem 是否线程安全?记得以前看到有个网站的

#12 楼 @fsword 明白了。。你连启动一个 Rails 进程的内存都没有。

#15 楼 @hooopo 是啊,就是一个普通的 vps,有一个 rails 进程就已经差不多了,压力不大,所以首先不是加内存

@fsword 线程安全问题的确比较头疼,不知道是不是尝试过 passenger+ree,copy on write 的话,内存消耗应该不比多线程多,而且不用担心线程安全的问题

你这种需求用 Nodejs 或 Eventmachie/Thin 就比较好实现。 有耗时任务直接新建一个异步的 timer,既不消耗多余的内存,又不影响当前进程,缺点是未执行的任务在重启服务器的时候会丢失,还得去考虑一些持久化的事情。

#17 楼 @flyerhzm ree 没用过,不过听说这个不是不维护了吗? #18 楼 @hooopo 换用 eventmachine/thin 恐怕也不能避免线程冲突,我现在有点怀念 erlang 了,要是强制不许变化,那所有的库都一定安全啊

#19 楼 @fsword 你这个都用 puma 了。说明你已经把 rails 的线程模式打开了。要不然你用 puma 也还是同时只能有一个响应。

如果出问题,那早就出问题了。不会因为你这个 thread 出什么别的问题。

#20 楼 @Saito 我自己被自己搞晕了,好像是这么回事。不过 puma 现在刚开始用,估计没机会遇到冲突,我再观察试验一下

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