Download the PHP package workbunny/webman-rqueue without Composer
On this page you can find all versions of the php package workbunny/webman-rqueue. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download workbunny/webman-rqueue
More information about workbunny/webman-rqueue
Files in workbunny/webman-rqueue
Package webman-rqueue
Short Description Webman plugin workbunny/webman-rqueue
License MIT
Informations about the package webman-rqueue
workbunny/webman-rqueue
🐇 A lightweight queue based on Redis Stream for webman plugin. 🐇
A lightweight queue based on Redis Stream for webman plugin
常见问题
-
什么时候使用消息队列?
当你需要对系统进行解耦、削峰、异步的时候;如发送短信验证码、秒杀活动、资产的异步分账清算等。
-
RabbitMQ和Redis的区别?
Redis中的Stream的特性同样适用于消息队列,并且也包含了比较完善的ACK机制,但在一些点上与RabbitMQ存在不同:
- Redis Stream没有完善的后台管理;RabbitMQ拥有较为完善的后台管理及Api;
- Redis的持久化策略取舍:默认的RDB策略极端情况下存在丢失数据,AOF策略则需要牺牲一些性能;RabbitMQ持久化方案更多,可对消息持久化也可对队列持久化;
- RabbitMQ拥有更多的插件可以提供更完善的协议支持及功能支持;
-
什么时候使用Redis?什么时候使用RabbitMQ?
当你的队列使用比较单一或者比较轻量的时候,请选用 Redis Stream;当你需要一个比较完整的消息队列体系,包括需要利用交换机来绑定不同队列做一些比较复杂的消息任务的时候,请选择RabbitMQ;
当然,如果你的队列使用也比较单一,但你需要用到一些管理后台相关系统化的功能的时候,又不想花费太多时间去开发的时候,也可以使用RabbitMQ;因为RabbitMQ提供了一整套后台管理的体系及 HTTP API 供开发者兼容到自己的管理后台中,不需要再消耗多余的时间去开发功能;
注:这里的 轻量 指的是 无须将应用中的队列服务独立化,该队列服务是该应用独享的
简介
- 基于Redis Stream的轻量级队列;
- Queue 模式:多个消费者竞争消费
- 支持普通消费
- 支持延迟消费
- Group 模式:多个消费组订阅消费
- 支持普通消费
- 支持延迟消费
- Adaptive 模式:Queue的自适应版消费者
- 支持普通消费
- 支持延迟消费
- 可靠的重载机制,防止消息意外丢失/重复消费
- 使用本地sqlite库储存因意外中断的消息
- 自动加载本地消息至队列
- 简单易用容易理解的使用方式
- 丰富的命令行助手,助手函数
- BuilderClass继承模式(类似ORM的ModelClass)
- 支持自定义BuilderClass,实现自定义的消费逻辑
安装
使用
QueueBuilder
- 一个QueueBuilder类对应一个消费Group和一个消费逻辑
- 一个QueueBuilder可对应一个/多个Redis-Stream-Key,通过配置
- QueueBuilder类使用定时器进行消费,每一次消费之后会根据消息的属性 来进行消息释放
命令行
--mode默认为queue
-
创建
- 移除
移除包含了类文件的移除和配置的移除
- 开启
开启仅对配置进行移除
- 关闭
关闭仅对配置进行移除
GroupBuilder
- 一个GroupBuilder类对应一个消费Group和一个消费逻辑
- 一个GroupBuilder可对应一个/多个Redis-Stream-Key,通过配置
- GroupBuilder类使用定时器进行消费,使用定时器释放当前 Stream-Key 上所有Group收取过的闲置消息
- 可以使用多个GroupBuilder类配置相同的 ,从而达到一条/多条队列由不同的消费逻辑进行处理;
- 基于此特性,可以实现消息持久化的发布订阅
- 基于此特性,可以实现RabbitMQ的exchange模式
命令行
-
创建
- 移除
移除包含了类文件的移除和配置的移除
- 开启
开启仅对配置进行移除
- 关闭
关闭仅对配置进行移除
AdaptiveBuilder
说明
- AdaptiveBuilder与QueueBuilder的消费方式一致
- AdaptiveBuilder底层定时器会根据闲置阈值进行判断,消费定时器根据退避指数 x 当前消费间隔进行重置消费间隔
相较于其他Builder的优势
- 在消息负载较高的情况下,AdaptiveBuilder是普通的QueueBuilder
- 在消息负载较低的情况下,AdaptiveBuilder根据闲置阈值对消费者的消费查询速率进行自适应退避调整,有效减少redis的查询压力
- 在延时消费场景下,AdaptiveBuilder能有效减少因频繁查询redis而造成的redis-server CPU占用率较高的问题
- 在普通消费模式下,AdaptiveBuilder相比于其他Builder能更快启动下一个消费周期,无需等待Timer的下一个loop,消费更及时
命令行
-
创建
- 移除
移除包含了类文件的移除和配置的移除
- 开启
开启仅对配置进行移除
- 关闭
关闭仅对配置进行移除
自定义Builder
如queue/group Builder都不满足需求,您可继承 AbstractBuilder 自行实现您所需要的Builder
-
您的Builder基类需要继承AbstractBuilder实现,可参考QueueBuilder/GroupBuilder
- onWorkerStart 用于进程启动时的触发逻辑, 这里一般使用Timer结合读取队列触发callback来实现消费队列
- onWorkerStop 用于进程停止时的回收动作
- onWorkerReload 用于进程重载时的触发动作,除非有特殊处理,通常置空
-
classContent方法是配合命令行,用于自动生成队列文件,如不使用,可置空
- Traits类提供所需的基础方法,按需在您的Builder基类中引用
- MessageQueueMethod 提供针对redis-stream队列的基础操作,如ack、publish、consume等、
- MessageTempMethod 提供本地数据缓存,用于对异常数据的收集和requeue
- 如上述traits无法满足需求,可自定义Traits
注意
-
QueueBuilder与GroupBuilder在命令行自动生成时没有做类似Delayed的区分,用户可自行进行命名区分,如:
-
创建的Builder类可以手动修改调整
- 为Builder添加进process.php的配置可以手动修改
查看Builder
注:当 Builder 未启动时,handler 与 count 显示为 --
生产
发布普通消息
注:向普通队列发布延迟消息会抛出一个 WebmanRqueueException 异常
发布延迟消息
注:向延迟队列发布普通消息会抛出一个 WebmanRqueueException 异常 注:延迟队列发布消息不支持指定消息id
说明
-
生产可用,欢迎 issue 和 PR;
-
Redis Stream 本身没有 delayed 或 non-delayed 之分,组件代码将它们区分的原因是不希望 delayed 被滥用;开发者应该明确哪些消息是延迟的、哪些是立即的,并且明确体现,也方便维护,因为延迟消息过多会导致消息堆积,从而占用Redis过多的资源;
-
延迟队列是通过对消息的不断读取放回并且加以判断是否达到延迟触发时间来进行模拟延迟触发的效果,消息不支持指定id,请在逻辑内自行实现;
-
Redis Stream 的持久化依赖 Redis 本身的持久化策略,在一定情况下 Redis Stream 也并非是可靠型的消息队列;关于持久化相关内容,请仔细阅读 Redis中文文档;
- 本地重载机制使用了SQLite3,详见 src/Builders/Traits/MessageTempMethod
All versions of webman-rqueue with dependencies
ext-redis Version *
psr/log Version ^2.0 | ^3.0
psr/container Version ^1.0 | ^2.0
webman/console Version ^1.0
illuminate/redis Version ^9.0 | ^10.0 | ^11.0
illuminate/events Version ^9.0 | ^10.0 | ^11.0
illuminate/database Version ^9.0 | ^10.0 | ^11.0
monolog/monolog Version ^2.0 | ^3.0