uwsgi spoolers的执行模型是什么?
我需要一个任务队列,这样一些比较耗资源的操作就可以在不影响用户的情况下,从uwsgi的环境中移出去。因为我们已经在使用uwsgi应用服务器,所以如果能用uwsgi的spooler作为任务队列就最好了。我想知道它具体是怎么工作的。被放入队列的任务是否还是在其他的uwsgi工作进程中执行?如果是这样的话,服务器还是会很忙,因为其他的工作进程会被这些任务占用。有没有更好的选择?我在使用python。
2 个回答
uWSGI Spooler 是一个内置于 uWSGI 的队列管理工具,类似于打印或邮件系统。这个方法比较基础,但非常可靠。
在 Python 中,最流行的队列工具是 Celery,它提供了很多任务管理的选项和功能。不过,使用 Celery 的系统并不是最容易维护的,当出现问题时,找出原因通常也不简单。你可以问任何一位 DevOps 工程师他们使用 Celery 的经历,准备好听到一些不太好听的话。
幸运的是,还有一个替代方案:uWSGI Spooler,今天我们就来聊聊这个。
uWSGI Spooler 和 Celery 的主要区别在于,前者不需要额外的组件(比如 Celery 可能需要像 Redis 这样的存储系统),这就减少了出错的可能性。任务可以存储在一个目录、外部目录或网络池中。
所以,这里有一个“必读”的参考列表:
参考链接: http://uwsgi-docs.readthedocs.org/en/latest/Spooler.html
每个“spooler”都是一个独立的进程,专门用来处理存放在某个文件夹(叫做spool目录)里的任务文件。可以有多个spooler进程同时在同一个spool目录下工作,这样可以让任务组并行处理。此外,还可以设置多个spool目录,以便处理不同的任务组。
这种spooler的方法非常基础,但几乎不需要维护(如果要删除任务,只需删除相应的文件即可),而且非常可靠。
在我知道的Python世界里,唯一的替代方案(而且可能是最常用的)就是celery。
另外,你也可以使用经典的redis加守护线程的方法,在这种情况下,一个Python线程会从redis中获取任务来处理。最终,你还可以用uWSGI的mule(类似于worker,但没有外部访问权限)来代替线程处理任务。