esd/hashed-wheel-timer-plugin
Composer 安装命令:
composer create-project esd/hashed-wheel-timer-plugin
包简介
the HashedWheelTimer delay task
关键字:
README 文档
README
HashedWheelTimer是采用一种定时轮的方式来管理和维护大量的Timer调度算法。 一个 HashedWheelTimer 是环形结构,类似一个时钟,分为很多槽,一个槽代表一个时间间隔,每个槽又对应一个类似Map结构的对象,使用双向链表存储定时任务,指针周期性的跳动,跳动到一个槽位,就执行该槽位的定时任务。 环形结构可以根据超时时间的 hash 值(这个 hash 值实际上就是ticks & mask)将 task 分布到不同的槽位中, 当 tick 到那个槽位时, 只需要遍历那个槽位的 task 即可知道哪些任务会超时(而使用线性结构, 你每次 tick 都需要遍历所有 task), 所以, 我们任务量大的时候, 相应的增加 wheel 的 ticksPerWheel 值, 可以减少 tick 时遍历任务的个数.
本插件模拟java HashedWheelTimer 的实现。使用redis做持久存储。
配置方法
配置一个环形结构池
hashedWheelTimer:
db: default
max_pending_timeouts: 100
wheel:
- {name: aaa, tick_duration: 1, ticks_per_wheel: 60 }
name 池子名称,投递任务的时候需要
tick_duration,时间间隔,1秒
ticks_per_wheel,时间槽数量,60个,代表一分钟一个轮次
max_pending_timeouts,每一个槽允许的最大协程数,默认100,如果耗时任务或者队列特别长需要适当增加时间槽数量比如3600。不适合特别精准的延时场景。
db,使用的 redis 配置,强烈建议不要使用default,会占用http服务的连接数,应该复制一份配置专用
使用方法
投递任务
//环形池名称,执行任务的类,投递参数,延迟执行时间,秒
$this->addTask('aaa', TimerTask::class,['a'=>'b', 'time' => time()], 60);
投递类
投递的类需要继承 HashedWheelTimerRunnable
<?php
namespace app\Controller;
use ESD\Plugins\HashedWheelTimer\HashedWheelTimerRunnable;
class TimerTask extends HashedWheelTimerRunnable{
public function run()
{
/**
//此处可根据延迟次数设置不同的延迟时间,比如支付通知失败
if($this->getDelayTimes() <= 1){
$this->setDelayTTL(10);
}else if ($this->getDelayTimes() <= 2){
$this->setDelayTTL(20);
} else if ($this->getDelayTimes() <= 3){
$this->setDelayTTL(30);
} else if ($this->getDelayTimes() <= 4){
$this->setDelayTTL(40);
}else if ($this->getDelayTimes() <= 5){
$this->setDelayTTL(40);
}
* **/
//如果 return false 或者该类触发任意异常,系统会将此任务重新投递到下一次执行的位置。
//如果不需要失败重试,需要 return true。可通过 getRetryTimes 获取重试次数进行判断
//如超过5次则不再重试,直接return true。
$this->getRetryTimes()
//获取投递参数
$params = $this->getParams();
// TODO: Implement run() method.
$this->info('run', $params);
//如果执行 setDelayTTL , 需要return true ,否则会被重新投递到下一次执行的位置。
return true;
}
}
esd/hashed-wheel-timer-plugin 适用场景与选型建议
esd/hashed-wheel-timer-plugin 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 26 次下载、GitHub Stars 达 2, 最近一次更新时间为 2019 年 06 月 26 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「hashedWheelTimer」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 esd/hashed-wheel-timer-plugin 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 esd/hashed-wheel-timer-plugin 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 26
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 10
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: Apache-2.0
- 更新时间: 2019-06-26