我尝试了几个消息/作业队列系统,但它们似乎都增加了不必要的复杂性,我总是因为没有任何理由而死亡的队列进程和神秘的日志消息而终结。
所以现在我想使用Redis创建自己的队列系统。你会怎么做呢?
根据我的阅读,Redis是好的,因为它有lpop和rpush方法,还有一个pub / sub系统,可以用来通知工作者有消息要消耗。这是对的吗?
答案 0 :(得分:1)
是的,你可以。实际上有很多包正是这样做的......包括Python的Celery和RQ以及Ruby的resque和 resque 到Java的端口(Jesque和Javascript(Coffee-resque)。
还有RestMQ在Python中实现,但设计用于任何ReSTful系统。
还有很多其他人。
请注意,Redis LIST是最简单的网络排队系统。然而,对Redis提供的简单原语进行强制操作是非常重要的(对于某些“强大”的值来说可能是不可能的 - 至少在服务器端)。这些用于将Redis用作队列的库中添加了许多功能和协议,旨在最大限度地减少丢失消息的机会,同时确保“最多一次”语义。其中许多使用RPOPLPUSH Redis原语和辅助LIST上的一些其他处理来处理已完成工作的确认和重新发送“丢失”单元。 (考虑一些客户端从队列中“弹出”一个工作单元并在发布工作结果之前死亡的情况;如何检测并缓解该情况?)
在某些情况下,人们已经编写了精心设计的服务器端(Redis Lua EVAL)脚本来处理更可靠的排队。例如,实现类似RPOPLPUSH的东西,但用ZADD替换“push”(从而将项目和时间戳添加到表示“正在进行中”工作的“有序集合”)。在此类系统中,工作已使用ZREM完成,并使用ZRANGEBYSCORE扫描“丢失”的工作。
以下是关于Salvatore Sanfilippo(又名 antirez ,Redis的作者)实施强大排队系统主题的一些想法:Adventures in message queues他讨论了导致他的考虑因素和力量处理disque。
我相信你会发现一些批评者认为Redis是一个“真正的”消息总线和排队系统(如RabbitMQ)的可怜替代品。 Salvatore在他的博客文章中说了很多,我欢迎其他人在这里说出更喜欢这类系统的有力理由。
我的建议是在早期原型制作过程中从Redis开始;但要将您使用的系统抽象为一些合并的代码。芹菜,其实,实际上为你做这件事。您可以开始使用带有Redis后端的Celery,并使用RabbitMQ或其他方法替换后端,而对代码的大部分影响不大。
对于替代品目录,请考虑仔细阅读:http://queues.io/