利用beanstalkd实现电商网站订单超时自动取消,自动确认收货功能

公司电商APP要实现订单自动取消,自动确认收货,以及在规定时间内多人拼单功能,这里我们采用了beanstalkd队列消息中间件,简单来讲就是用到了beanstald的管道与任务,这里自动取消,自动确认,超时未拼单,自动转为拼单失败这些业务场景我们可以理解为管道,我们可以在beanstalkd里建立这些业务场景对应的管道(tube),那么这里我们加入到管道里的订单id,我们可以理解为任务。

首先我们来简单理解一下beanstalkd的核心元素以及工作流程

生产者 -> 管道(tube) -> 任务(job) -> 消费者

以上是其工作流程,这里我们再来理解下,任务这个概念,任务是有多种状态的

delayed 延迟状态

ready 准备好状态

reserved 消费者把任务读出来,正在执行的任务

buried 预留状态

delete 删除状态

如果你对beanstalkd一无所知,建议你去详细学习下,一般1-2个小时即可了解相关的概念。
我只对需要掌握的核心关键点做说明,不做详细讲解。
这里,我们需要简单理解下,任务只有在ready状态下才能被取出消费。并且生产任务的时候,可以指定延时,也就是过了我设定的时间,任务才能变成ready状态,正是利用了这点,我们才实现了定时执行功能。

对于beanstalkd的安装,大家自己上网搜一下,这里安装的服务器不一定是需要与代码服务器安装在一起,可以单独安装在另一台服务器。

那么我们现在用自动取消订单业务场景来说,我们要建立一个管道(Tube_cancel),那么用户在下单的时候,我们将订单id,加入管道,这就是生产者的行为,负责生产任务队列,这里需要注意的是我们在将任务加入队列时,需要设置延时状态,就像我们设置cookies的有效时间一样,过了这个时间,该任务就成了ready状态,就能被取出消费了。那么消费者就负责从该任务队列里拿到订单id,走取消订单流程。取消订单大家不要误解,所有的订单id都要走取消订单流程,只是不满足取消状态的订单,我们就会直接从队列里删除了。

这里对于初学者,会存在两点疑惑,就是以上如何利用php代码实现,以及php如何实现守护进程从管道里拿订单id。

这里我们就需要说下,pheanstalk,Pheanstalk是beanstalkd工作队列的纯PHP 5.3+客户机,利用这个类我们可以实现beastalkd生产代码和消费者的代码。

项目地址:
https://github.com/pda/pheanstalk/

require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);//这里就是连接我们beanstakd所在的服务器地址

$tubeName='order_canceld';//定义管道名称,订单id就放在这个管道

$delay_time=60*60//设定订单一个小时,自动取消

$pheanstalk ->useTube( $tubeName) ->put($order_id);

//这里我只存了一个订单id,如果是数组,也可以存json_encode($array);

那么以上就实现了生产者的功能,将订单id存入了order_canceld这个管道,一个小时后,该订单id即可被消费者使用,那么我们再来看下消费者的代码。

require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);

$tubeName='order_canceld';

//获取队列信息,reserve 阻塞获取
$job = $pheanstalk ->watch($tubeName) ->ignore('default') ->reserve();
 
$order_id=$job->getData();

//接下来我们就需要判断该订单的状态,如果还未付款,就可以执行取消订单的操作,如果付款了则从队列中删除

那么接下来我们就要实现消费者守护进程,这里我们用到了supervisord进程管理工具,大家可以在网上搜索下教程,安装配置即可,那么最终我们配置supervisord.conf,启动supervisord即可实现消费者代码的守护进程。
以下是配置文件相关代码,具体大家可以在网上搜索下supervisord进程管理工具。

[program:order_canceld]
command=/usr/bin/php  www/order_cancel.php  Crontab/orderCancel 
priority=999                ; the relative start priority (default 999)
....
....
....

那么至此,我们就实现了关于定时相关的业务需求,重点说明下,定时的实质其实就是利用了beanstalkd的延时特性,supervisord保证了及时性,如果没有supervisord进程守护,那么即使订单到达时间点,变为可消费了,但是业务程序没有及时来消费这个订单id(比如订单id,到了一小时了,此时业务程序应该拿到id去判断是否应该取消,这个就是我们说的消费订单id,这个生产和消费是beanstalkd里的专业术语,如果大家还没有深入学习下beanstalkd,这里理解可能会有点困难,故做此说明),那么就并没有真正实现定时,所以这两者的结合就保证了定时功能的实现,希望大家明白这一点。最后总结下,我们主要用到了beanstakd,beanstalkd客户端管理类pheanstalkd,以及进程管理工具supervisord,这三个关键点希望大家可以自行深度学习,然后自己动手实现下,一定会有不小的收货。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,340评论 8 265
  • 透过水的澄澈, 我看到河底油油的水草, 扭动着妖娆的身躯, 对每一条路过的鱼招手, 停下吧, 舞动吧, 不要停歇,...
    那是爱情啊阅读 296评论 0 1
  • 宝贝,你是妈妈的小英雄? 为什么呀 因为你经常带给妈妈温暖和感动 那我和你一起洗碗吧,我也当你小助手 宝贝,这瓶玻...
    A宝的时光阅读 135评论 0 0
  • 好久没有在简书写文章了。 原因就是报名了三节课的互联网运营P1课程,为自己接下来的转行做准备。 为了上这门课放弃了...
    成年小饭阅读 360评论 1 1