gearman实现任务分发
偶然发现了这个gearman,觉得这玩意儿挺好用,非常适合PHP运行一部分业务。
话不多说,安装一下。
使用apt查找
sudo apt search gearman
找到了这个
gearman/bionic,bionic 1.1.18+ds-1 all
Distributed job queue
好,开始安装
sudo apt-get install gearman
好,安装完成,然后查看是否运行
ps -ef |grep gearman
发现有在运行
$ ps -ef |grep gearman
gearman 1660 1 0 02:54 ? 00:00:00 /usr/sbin/gearmand --pid-file=/run/gearman/gearmand.pid --listen=localhost --daemon --log-file=/var/log/gearman-job-server/gearmand.log
vagrant 2310 1452 0 02:54 pts/0 00:00:00 grep --color=auto gearman
好,然后开始安装php的扩展(因为我PHP版本是7.4 所以这里直接查7.4的对应版本扩展了)
$ sudo apt search php7.4-gearman
Sorting... Done
Full Text Search... Done
php7.4-gearman/bionic 2.1.0+1.1.2-5+ubuntu18.04.1+deb.sury.org+1 amd64
PHP wrapper to libgearman
然后开始安装这个扩展
sudo apt-get install php7.4-gearman
安装完毕使用php -m过滤一下看看有没有启用
$ php -m |grep gearman
gearman
发现好了,然后开始建两个文件
add_job.php
<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
$res1 = $client->doBackground('runLaterJob', json_encode(array(
'uid' => 'test user id',
'title' => '添加一个需要延时处异步执行的代码标题',
'body' => '执行这个异步的具体内容',
'sleep_time' => 2,
)));
再创建一个 work_job.php
<?php
$worker = new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('runLaterJob', function($job) {
$data = json_decode($job->workload(), true);
if (isset($data['sleep_time']) && $data['sleep_time'] > 0) {
sleep($data['sleep_time']);//如果需要延时 就延时处理
}
echo "处理任务 uid:{$data['uid']}--title:{$data['title']}--body:{$data['body']} 成功\n";
});
//死循环等待job提交的任务
while($worker->work());
启动 work_job.php
php work_job.php
屏幕无任何输出,再启动 add_job.php
php add_job.php
然后 add_job.php 迅速跑完了,然后看到 work_job.php 2秒后有输出
处理任务 uid:test user id--title:添加一个需要延时处异步执行的代码标题--body:执行这个异步的具体内容 成功
这里我们可以看到,添加job的人投递任务完毕后可以立刻干别的事情,由work消费job的人来慢慢的处理业务,这就非常适合用来处理那种订单延时关闭的处理业务。
比如说,创建订单后20分钟内不支付则自动释放库存,那么就可以在创建订单的时候投递这样一个job,然后后续的由消费job在设定的20分钟后来处理订单,决定它是否需要释放库存(如果需要支付了就不操作任何动作,如果还没支付,就取消库存,并把订单设置为过期未支付订单)
以往我们在处理这种业务类型的时候用的是crontab来定时查哪些订单需要被关闭,哪些订单需要被释放库存,但这样高度依赖了crontab设定的执行时间的频率,总不能设定为1分钟跑一次吧?如果设定为10分钟一次,比如我们设定为08:00,08:10,08:20等等,就会出现8:00刚跑完定时任务后就下单的用户,他的订单创建时间是08:01,那么对于它而言,08:21分它才应该被关闭,可这个时候08:20的定时任务已经跑完了,那么这个订单就在08:30的定时任务被扫到,等于说它实际上等待了29分钟,这就有了一定程度上的不合理。
而使用这个任务分发,就可以让它的任务在后台躺着被自动处理就可以了。
gearman实现任务分发的更多相关文章
- php使用gearman进行任务分发
一.安装gearman 下载gearman源码包 1 https://launchpad.net/gearmand/+download 如: gearmand-1.1.12.tar.gz 下载php的 ...
- 分布式任务分发框架Gearman教程和PHP实现实例
1.Gearman介绍和使用场景 Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完 ...
- 分布式的任务分发框架-Gearman
官方文档:http://gearman.org/getting-started/ 安装方法和示例都有,可以详细看一下. Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,G ...
- Gearman 安装使用教程
Gearman是一个分发任务的程序框架,可以用在各种场合,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成. Gearman 分布式任务实现原理上只用到2个字段 ...
- 分布式任务系统gearman的python实战
Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统.Gearman是一个分发任务的程序框架,可以 ...
- Gearman的使用
对于分布式网络环境或者有大量任务的应用,我们需要将任务在不同的服务器之间进行分布,这个时候正好是Gearman发挥实力的时候.虽然我们也可以使用MQ队列再加一些自己实现的调度算法来将任务进行分发,但是 ...
- linux 下 php 安装 Gearman
Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务. 一个Gearman请求的处理过程涉及三个角色: Clien ...
- 利用gearman同步mysql数据到redis
一.Gearman 1.Gearman是一个分发任务的程序框架. 2.体系:a.client:发送一个jobb.server:找到合适的worker,把job交给该workerc.worker:处理j ...
- Gearman 初窥【转载】
Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于Live ...
- gearman的安装与使用
Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.php官方收录:http://php.net/manual/zh ...
随机推荐
- 【爬虫实战】——利用bs4和正则表达式,简单实现爬取数据
前言 好久没有写博客了,由于一直比较忙,感觉快荒废了学习的步伐,最近由于需要利用爬虫爬取数据,总结一下,以便以后查阅. 目录 一.bs4的安装 二.bs4解析器 三.定位查找标签 四.转换格式 五.提 ...
- 使用 nuxi build-module 命令构建 Nuxt 模块
title: 使用 nuxi build-module 命令构建 Nuxt 模块 date: 2024/8/31 updated: 2024/8/31 author: cmdragon excerpt ...
- python操作ipv6_用python开启临时http服务器及其ipv6支持
https://blog.csdn.net/weixin_35647799/article/details/112023159
- 使用 nuxi prepare 命令准备 Nuxt 项目
title: 使用 nuxi prepare 命令准备 Nuxt 项目 date: 2024/9/7 updated: 2024/9/7 author: cmdragon excerpt: 摘要:本文 ...
- openStack-train 1-搭建部署
openStack-train 搭建部署 当面对KVM集群的时候,我们对KVM的管理以及宿主机的管理就会遇到很大的难度,例如: 查看每一个宿主机有多少台KVM虚拟机? 查看每一个宿主机资源信息,每一个 ...
- babel-preset-env与stage-x的使用指南
babel介绍 babel总共分为3个阶段: 解析.转换和生成 babel本身不具有任何转换功能, 如果没有plugin,那么经过babel的代码和输入的是相同的. babel插件分为两种 语法插件: ...
- js 翻译 c# 注意事项
1. split('') 在 c# 是不可以 .Split("") 的 要写 ToCharArray() 更新: 2021-09-25, split('') 是不好的写法, es6 ...
- 【Abyss】Android 平台应用级系统调用拦截框架
Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环 -- SVC系统调用拦截. ☞ Github ☜ 由于我们虚拟化产品的需求,需要支持在普通的Android手机运行.我们 ...
- Qt中当程序结束时线程的退出
在Qt程序结束时应该如何退出正在运行的任务子线程? 因个人经验和能力有限,本文仅供参考,有错误或者考虑不完善的地方请各位批评指正. 一.正常情况下如何创建和退出线程 1.继承QThread,重写run ...
- Windows Terminal3.1
其实就是为了把之前写的东西集成起来所以搞了一个终端. 下载 集成功能 Wordle ABCG RandTool cmd 便捷功能 FastFile (快速打开目标文件夹) show 文件说明 Term ...