当 Laravel 5.3 RedisQueue 遇到阿里云 Redis 的时候

教程 lijinma ⋅ 于 2016-12-23 17:58:54 ⋅ 最后回复由 lijinma 2016-12-29 09:38:31 ⋅ 946 阅读

公司的微服务的 api 使用的是 Lumen 5.2 来做的,队列使用 Redis 跑得很好。

最近做了一个网站项目,使用了 Laravel 5.3,就在昨天我们使用了 Laravel 5.3 的队列,driver 使用的是 Redis,简单好用。

本地测试顺利,CI 跑完,开开心心的上线。

Bang...... 出错日志疯一样的出现,如下:

[2016-12-23 10:07:14] production.ERROR: Predis\Response\ServerException: ERR unknown command eval in /var/www/html/vendor/predis/predis/src/Client.php:370
Stack trace:
#0 /var/www/html/vendor/predis/predis/src/Client.php(335): Predis\Client->onErrorResponse(Object(Predis\Command\ServerEval), Object(Predis\Response\Error))
#1 /var/www/html/vendor/predis/predis/src/Client.php(314): Predis\Client->executeCommand(Object(Predis\Command\ServerEval))
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php(187): Predis\Client->__call('eval', Array)
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php(132): Illuminate\Queue\RedisQueue->migrateExpiredJobs('queues:default:...', 'queues:default')
#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(173): Illuminate\Queue\RedisQueue->pop('queues:default')

看一下 RedisQueue 代码就会发现,现在的实现已经大部分都使用 LuaScript 来进行操作,不使用原生方法来操作,使用 LuaScript 来操作好处很多,比如:

  • 高效性:减少网络开销及时延,多次redis服务器网络请求的操作,使用LUA脚本可以用一个请求完成
  • 数据可靠性:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
  • 复用性:LUA脚本执行后会永久存储在Redis服务器端,其他客户端可以直接复用
  • 便捷性:实现程序热更新
  • 可嵌入性:可嵌入JAVA,C#等多种编程语言,支持不同操作系统跨平台交互
  • 简单强大:小巧轻便,资源占用率低,支持过程化和对象化的编程语言
  • 免费开源:遵循MIT Licence协议,可免费商用化

这个时候我傻眼了,如果你是我,这个时候会怎么做?脑海里无数个想法:

  1. 是否可以降级 Laravel Queue 的版本?之前的版本是使用原生命令的。
  2. 是否可以切换别的 driver,但是成本有点高?
  3. 阿里云的 Redis 是否可以支持 lua 脚本?
  4. 是不是我眼花了?:no_good:

很明显我没有眼花,而且如果3可以的话,肯定是最方便快速的方案,所以马上搜索,发现今年7月份阿里刚好推出了支持 lua 脚本的 Redis,只不过需要申请。

https://yq.aliyun.com/articles/57805

好开心,马上提交工单,一会就审核通过就开通了 lua 脚本的功能,完美解决。

温馨提示:

  1. 开通支持 lua 脚本会有闪断。
  2. 可能会丢数据,请做好 Redis 的备份工作,不过我们没有遇见这个问题。
  3. 能开通就开通吧,说不准什么时候就用上了。:rose: :rose: :rose:

金马

酒店哥哥(上海)
我们一起来玩玩微服务,玩玩 Laravel
https://www.lagou.com/jobs/1930111.html
若有兴趣,直接发邮件给我 lijinma@hotelgg.com

本帖已被设为精华帖!
本帖由 JobsLong 于 3周前 加精
回复数量: 6
  • qq215672398 还什么都没有哦
    2016-12-24 10:52:03

    同样的坑,之前一个微服务也是用lumen和redis队列,一上阿里云发现 eval 问题,不过听说有闪断问题之后就启用了 redis,换成 beanstalkd

  • lijinma 就喜欢折腾。
    2016-12-24 13:49:19

    @qq215672398 哈哈,beanstalkd 使用下来如何?

  • qq215672398 还什么都没有哦
    2016-12-24 16:37:27

    @lijinma 介于 laravel 的接口优雅,没有感受到任何区别 :smile:

  • lijinma 就喜欢折腾。
    2016-12-26 09:28:30

    @qq215672398 哈哈,那倒是。

    不过我想问的是使用 beanstalkd,你自己做一些查询方便吗?

    比如 Redis 我直接就可以查看 queue:default 里面有没有 push 进去东西。

    我可以直接 monitor 来查看队列的入队出队情况。

    beanstalkd 方便不?

  • qq215672398 还什么都没有哦
    2016-12-28 23:37:06

    有开源的各种查看实现 http://mnapoli.fr/phpBeanstalkdAdmin/

    不过我是写了两个删除,查看的脚本。整体来说确实 redis 更加方便,beanstalkd 毕竟是专门的队列系统,业务拓展起来还是更好处理。

    最近准备更多的去依赖 redis 做一些实时的数据数据,调研没什么问题的话也准备申请 lua 了,计算起来太方便了。

  • lijinma 就喜欢折腾。
    2016-12-29 09:38:31

    @qq215672398 恩恩,谢谢你的分享。

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter