当前位置: 首页 > 后端技术 > PHP

async-helper,一款PHP异步流程助手

时间:2023-03-29 17:58:13 PHP

async-helper简介PHP的异步流程助手,借助AMQP实现PHP方法的异步执行,将一些耗时、高可用、需要重试的操作放入在异步进程中执行,将您的HTTP服务从繁重的业务逻辑中解放出来。以低成本将传统的PHP业务逻辑转换为非阻塞、高可用、可扩展的异步模式。依赖php5.6+ext-bcmathext-amqp1.9.1+ext-memcached3.0.3+通过composerinstallcomposerrequirel669/async-helper安装或者直接下载项目源码wgethttps://github.com/l669306630/async-helper/archive/master.zip使用示例业务逻辑:这里定义了许多等待调用的类和方法,在您的项目中这可能是一个数据模型,或者一个用于发送电子邮件的类。'127.0.0.1','port'=>'5672','user'=>'root','pass'=>'123456','vhost'=>'/']);//第三步,将用户信息保存到数据库$mail=['from'=>'service@yourdomain.com','to'=>'username@163.com','subject'=>'恭喜你注册成功','body'=>'请点击邮件中的链接完成验证....'];//第四步,通过Asynchronoushelper发送邮件$async_helper->run('\\SendMailHelper','request',[$mail]);//这是一种同步发送邮件的方式,如果邮件服务响应缓慢或异常,将直接影响请求的响应时间,甚至丢失这封重要的邮件//SendMailHelper::request($mail);}}Consumer:PHP的异步进程,监听消息队列,执行你指定的方法。而消费者进程是一个可扩展、高可用的服务,这一切都归功于AMQP,它是系统解耦和微服务布局的最佳方案。consume.php'127.0.0.1','port'=>'5672','user'=>'root','pass'=>'123456','vhost'=>'/','cacheHelper'=>$cache_helper]);$async_helper->consume();}catch(Exception$e){//可以在这里记录一些日志sleep(2);}}#在命令行下启动消费者进程。推荐使用supervisor来管理进程。phpconsume.php支持事务:多个异步方法需要一次提交,事务可以保证完成。//按照上面的例子,这里省略一些重复的代码,同$async_helper->beginTransaction();try{$async_helper->run('\\SendMailHelper','request',[$mail1]);$async_helper->run('\\SendMailHelper','request',[$mail2]);$async_helper->run('\\SendMailHelper','request',[$mail3]);$async_helper->commit();}catch(\Exception$e){$async_helper->rollback();}阻塞重试:异步流程执行方法时,方法内部抛出异常时重试,有些业务必须followtheexecutionorder需要使用阻塞重试,通过指定阻塞重试的最大时间来控制。使用l669\CacheHelper;使用l669\AsyncHelper;$async_helper=newAsyncHelper(['host'=>'127.0.0.1','port'=>'5672','user'=>'root','pass'=>'123456','vhost'=>'/','cacheHelper'=>newCacheHelper('127.0.0.1',11211),'retryMode'=>AsyncHelper::RETRY_MODE_REJECT,//阻止重试'maxDuration'=>600//最多重试10分钟]);$send_mail_helper=new\SendMailHelper();$mail=new\stdClass();$mail->from='service@yourdomain.com';$mail->to='username@163.com';$mail->subject='恭喜您注册成功';$mail->body='请点击邮件中的链接完成验证...';$async_helper->run($send_mail_helper,'request',[$mail]);//如果方法需要抛出异常结束程序,不想被异步进程重试,可以抛出如下错误码,处理后捕获这些异常将放弃重试://l669\AsyncException::PARAMS_ERROR//l669\AsyncException::METHOD_DOES_NOT_EXIST//l669\AsyncException::KNOWN_ERROR非阻塞重试:当异步执行的方法内部抛出异常时,async-helper会将该方法放回队列尾部,先执行新进入的方法,然后重试刚才失败的方法,通过指定最大重试次数来控制。使用l669\CacheHelper;使用l669\AsyncHelper;$async_helper=newAsyncHelper(['host'=>'127.0.0.1','port'=>'5672','user'=>'root','pass'=>'123456','vhost'=>'new','cacheHelper'=>newCacheHelper('127.0.0.1',11211),'queueName'=>'emails.vip',//付费大叔队列的VIP'retryMode'=>AsyncHelper::RETRY_MODE_TTL,//非阻塞重试'maxRetries'=>10//最多10次重试]);$mail=new\stdClass();$mail->from='service@yourdomain.com';$mail->to='username@163.com';$mail->subject='恭喜您注册成功';$mail->body='请点击邮件中的链接完成验证....';$async_helper->run('\\SendMailHelper','request',[$mail]);应用与困惑我们使用开源的RabbitMQ为我们提供AMQP服务。你的项目部署在一个有很多服务器节点的集群上,每个节点的程序都需要写入日志文件。现在的问题是把所有节点上的日志收集到一个地方,方便我们及时发现问题或者做一些统计。所有节点都可以使用async-helper异步调用一个写日志的方法,执行这个写日志方法的过程只需要在一台机器上启动,这样所有节点的日志都实时掌握。做过微信公众号开发的都知道,腾讯微信可以将用户消息推送到我们的服务器。如果5s内没有及时响应,腾讯微信会重试3次。其实这就是消息队列的应用。使用async-helper可以很容易地做同样的事情。多亏了RabbitMQ,你可以轻松地横向扩展你的消费进程的能力,因为RabbitMQ天生就支持集群部署,你可以很方便的启动多个消费进程,或者将消费进程分布到多台机器上。RabbitMQ服务不可用怎么办?部署RabbitMQ高可用性服务很容易。它向外界提供单一IP。这个IP是一个负载均衡器,后面有一个RabbitMQ集群。负载均衡器负责后端集群节点的健康检查。async-helper能否处理高并发请求?async-helperproducer使用的是短连接,也就是说async-helper在你的HTTP响应浏览器之前就已经完成工作了,你连接RabbitMQ的时间比HTTP请求的时间少了100%.也就是说,只要RabbitMQ承受并发的能力超过了你的HTTP服务,RabbitMQ就永远不会崩溃,这通过水平扩展RabbitMQ很容易做到。与传统PHP相比,任何PHP方法都是通过反射异步执行的;高可用,执行方法进入消息队列,可以持久化,即使服务器宕机,执行任务也不会丢失;高可用,不限次数和异常可处理定时重试,重试次数和时间可配置;支持多个异步方法在事务中执行,支持回滚事务;方法参数类型支持除资源类型(resource)和回调函数(callable)之外的任何类型参数;得益于AMQP,异步方式可以承受高并发和高负载,支持集群部署和水平扩展;低延迟,实测延迟时间为0.016~0.021s;适用于:日常数据库操作、日志采集、金融交易、消息推送、发送邮件和短信、数据导入导出、计算大量数据生成报表;附录安装memcached安装rabbitmq安装php7.1.5,ext-amqp,ext-memcached安装supervisor

最新推荐
猜你喜欢