HuZhongyuan
HuZhongyuan
@he426100 当任务因为超出最大尝试次数而失败时,thinkphp-queue 这个库只是触发了名为 ‘queue.failed’ 的失败事件,但是库本身并没有内置失败事件的处理。如果想要捕捉该事件的话需要开发者手动在 application\tags.php 配置文件中添加 ‘queue.failed’ 事件。 举例: 定义事件 ```php // 任务失败回调 'queue.failed'=> [ 'application\\behavior\\MyQueueFailedLogger::logAllFailedQueues', ] ``` 处理事件 ```php class MyQueueFailedLogger { /** * @param $params \think\queue\Job *...
@he426100 supervisor 这个软件我还暂时没有接触:) 你可以咨询一下你们公司的运维,他们给出的建议应该比较专业。 也期待你能把 supervisor 的使用笔记分享一下。
@he426100 如果不改动他默认的 'queue.failed' 事件名,那么 tags.php 中配置该事件时: ```php 'queue.failed' => [ // 如果你的写法是下面这种 '类名' 形式的字符串,那么记得给 MyQueueFailedLogger 类添加一个 run 方法。 'application\\behavior\\MyQueueFailedLogger' , ] ``` 'queue.failed' 其实也不算是什么bug,改成 ‘queue_failed’ 更符合他们自己定义的事件命名规范而已。 官方的事件命名规范在这里: http://www.kancloud.cn/manual/thinkphp5/118130
@he426100 感谢提供 supervisor 的使用经验。
@he426100 这样也挺好 :) 或者可以参考一下laravel 的做法,把失败的任务转移到 另外的表中。
@he426100 ,好的,非常感谢提供。
每执行一次 php think queue:work --queue xxxx 命令, 就可以增加该队列的一个消费者 如果一个消费者不够, 就多执行几次, 达到消息的推送与消费的平衡 可以使用 supervisor 等运维工具自动化地管理消费者进程数量
从你的描述来看, 你说的需求实际上是定时任务, 而不是消费消息 消息队列的特点是有消息就消费, 没有消息就等着 你说的 每一秒去查看所有订单是否需要进行平仓 ,这个属于定时任务的范畴
你可以尝试一下当订单生成之后主动向队列推送一条消息, 然后由队列的消费者去处理这个订单 而不是定时去扫描现有的所有订单
你可以把需求拆分成两个部分: 第一部分负责从找出达到平仓条件的订单, 并将达到平仓条件的订单推送到队列中 第二个部分负责处理达到平仓条件的订单 第一部分可以不用队列来做, 而是用常驻脚本来做, 该常驻脚本的伪代码如下: ```php while(true){ // 从数据库或缓存中按照时间或者其他维度取出一定数量的订单 $ordersToCheck = $this->queryOrders(); // 从这些订单中过滤出达到平仓条件的订单 $orders = $this->filterSuitableOrders($ordersToCheck) ; foreach($orders as $order){ // 将达到平仓条件的订单推送到 'close-position' 队列中, 由消费进程去进行平仓操作 Queue::push($order, 'close-position');...