网站首页技术博客

thinkphp-queue 笔记​

洞天水月2021-03-12 14:29:281360人次阅读
摘要当前笔记中的内容针对的是 thinkphp-queue 的 v2.0 版本 传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题。在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费者作针对性的处理,从而降低系统耦合度,提高系统性能和可用性。

前言

当前笔记中的内容针对的是 thinkphp-queue 的 v2.0 版本

传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题。在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费者作针对性的处理,从而降低系统耦合度,提高系统性能和可用性。

一般来说,可以抽离的任务具有以下的特点:

  • 允许延后|异步|并行处理 (相对于传统的 即时|同步|串行 的执行方式)

    • 允许延后

      抢购活动时,先快速缓冲有限的参与人数到消息队列,后续再排队处理实际的抢购业务;

    • 允许异步

      业务处理过程中的邮件,短信等通知

    • 允许并行

      用户支付成功之后,邮件通知,微信通知,短信通知可以由多个不同的消费者并行执行,通知到达的时间不要求先后顺序。

  • 允许失败和重试

    • 强一致性的业务放入核心流程处理

    • 无一致性要求或最终一致即可的业务放入队列处理

thinkphp-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性:

  • 消息的发布获取执行删除重发失败处理延迟执行超时控制

  • 队列的多队列, 内存限制 ,启动停止守护

  • 消息队列可降级为同步执行

thinkphp-queue 内置了 RedisDatabaseTopthink ,Sync这四种驱动。本文主要介绍 thinkphp-queue 结合其内置的 redis 驱动的使用方式和基本原理。

注1:如无特殊说明,下文中的 ‘消息’ 和 ‘任务’两个词指代的是同一个概念,即队列中的一个成员。该成员对消息队列而言是其内部保存的消息; 对业务应用而言是一个待执行的任务。请根据语境区分。

注2:本文编写时(2019-01-30)使用的 thinkphp-queue 的版本号是 v2.0 。如有变更,请以官方最新版为准。

一 代码示例

先通过一段代码,了解一下 thinkphp-queue 的基本使用流程。

目标:

在业务控制器中推送一个新消息到一个名为 ‘helloJobQueue’ 的队列中,该消息中包含我们自定义的业务数据,然后,编写一个名为 Hello 的消费者类,并通过命令行去调用该消费者类获取这个消息,拿到定义的数据。

1.1 安装 thinkphp-queue

composer install topthink/think-queue

1.2 搭建消息队列的存储环境

  • 使用 Redis [推荐]

    安装并启动 Redis 服务
  • 使用数据库 [不推荐]


  • CREATE TABLE `prefix_jobs` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `queue` varchar(255) NOT NULL,  `payload` longtext NOT NULL,  `attempts` tinyint(3) unsigned NOT NULL,  `reserved` tinyint(3) unsigned NOT NULL,  `reserved_at` int(10) unsigned DEFAULT NULL,  `available_at` int(10) unsigned NOT NULL,  `created_at` int(10) unsigned NOT NULL,  PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.3 配置消息队列的驱动

转载 think-queue 笔记

文章评论