Yar(yet another RPC framework, 教主问我为啥都是Ya打头, 呵呵, 因为这样名字好起)是我在3个多月前, 为了解决一个实际的问题, 而开发的一个PHP扩展的, RPC框架, 和现有的RPC框架(xml-rpc, soap)不同, 这是一个轻量级的框架, 支持多种打包协议(msgpack, json, php), 并且最重要的一个特点是, 它是可并行化的..
考虑如下的场景:
传统的Web应用, 一个进程, 一个请求, 天经地义. 然而, 当一个请求的处理中, 涉及到多出数据源, 并且他们之间具有一定的不依赖性.
还是传统的Web应用, 一个应用随着业务快速增长, 开发人员的流转, 就会慢慢的进入一个恶性循环, 代码量上只有加法没有了减法. 因为随着系统变复杂, 牵一发就会动全局, 而新来的维护者, 对原有的体系并没有那么多时间给他让他全面掌握. 即使有这么多时间, 要想掌握以前那么多的维护者的思维的结合, 也不是一件容易的事情…
那么, 长次以往, 这个系统将会越来越不可维护…. 到一个大型应用进入这个恶性循环, 那么等待他的只有重构了.
那么, 能不能对这个系统做解耦呢?
我们已经做了很多解耦了, 数据, 中间件, 业务, 逻辑, 等等, 各种分层. 但到Web应用这块, 还能怎么分呢, MVC我们已经做过了….
基于此, Yar或许能解决你遇到的这俩个问题…
Yar是一个非常轻量级的RPC框架, 我在实现Yar的时候, 追求了极致的轻量级, 它使用非常简单, 对于Server端:
handle();
?>
和Soap使用方法很相像吧? 是的, 就这样, 你的API类就可以对外提供服务了..
Yar为了方便开发, 把文档和接口绑定到了一起, 对于上面的例子, 如果我们是简单的GET请求这个接口地址的话, 我们就会看到如下的信息页面:

这样, 我们可以在注释中,把接口的信息标注好, 就可以让文档和接口在一起了.
而对于Client端来说, 简单的串行调用, 会非常之简单:
api("parameter);
?>
这样一来, 如果你有多个服务, 你只需要一个client.
那么, 最激动人心的并行化调用呢?
这样, 所有的请求会一次发出, 只要有任何一个请求完成, 回调函数”callback”就会被立即调用.
这里还有一个细节, Yar见缝插针的不会浪费任何时间, 在这些请求发送完成以后, Yar会调用一次callback, 和普通的请求返回回调不同, 这次的调用的$callinfo参数为空.
这样一来, 我们就可以先发送请求, 然后再第一次回调, 继续做我们当前进程的工作, 等所有工作结束以后, 再交给Yar去获取并行RPC的响应.
有了这些, 我们就可以把一个Web应用中, 多个数据源并行处理, 从而也能把这些逻辑解耦, 分开部署…
当然Yar目前还在试用阶段, 所以还没有发布任何一个包(Yar at PECL), 但是有兴趣的同学可以现在就把代码clone下去试用哦(虽然没有正式投入试用, 不过已经经过了验证).
Yar: Yar at Github
PS, 如果要使用Msgpack(一个高效的二进制打包协议)做为打包协议, 需要单独安装Msgpack扩展(Msgpack), 这个扩展目前也是我在维护, 我会在近几天把他在PECL上发布, 尽请期待.
Comments
- 2012/09/15, pangbin writes: 学习了,请问鸟哥,微博校园招聘你要上吗?
- 2012/09/16, 奇言妙事-文学奇谈小小说阅读xlinblog.sinaapp.com » Yar – 并行的RPC框架(Concurrent RPC framework) writes: [...] 本文地址: http://www.laruence.com/2012/09/15/2779.html [...]
- 2012/09/17, Yar – 并行的RPC框架(Concurrent RPC framework)树林/咖啡 成都专业php网站制作 | 树林/咖啡 成都专业php网站制作 writes: [...] 风雪之隅 » PHP源码分析 Posted in: php / Tagged: framework, 并行的RPC框架Concurrent [...]
- 2012/09/17, fnsoxt writes: 这个太赞了,支持.快点进入1.0吧,哈哈,我肯定会用的
- 2012/09/18, rango writes: 现在用PHP来做Server的越来越多了。支持鸟哥。
这里也是用扩展实现了高性能的Server .
https://github.com/matyhtf/php_swoole
- 2012/09/18, 奇言妙事-文学奇谈小小说阅读xlinblog.sinaapp.com » Yaf and Phalcon, which is faster? writes: [...] Yar – 并行的RPC框架(Concurrent RPC framework) [...]
- 2012/09/24, Anonymous writes: 编译git上的/usr/local/src/yar/yar_client.c:473:4: error: non-void function 'php_yar_concurrent_client_callback' should return a value会报错,我改成return 0就好了。
- 2012/09/24, LBJ writes: 编译git上的/usr/local/src/yar/yar_client.c:473:4: error: non-void function 'php_yar_concurrent_client_callback' should return a value会报错,我改成return 0就好了。
- 2012/09/26, 雪候鸟 writes: @LBJ thanks, 已修复
- 2012/10/16, Erick writes: 这是个好东西啊,niao哥,你的sample的问题呢,server启动参数会报,client没有try catch。
何时出文档呢?目前纠结于yar和hprose。
- 2012/11/09, bee writes: 下载了pecl上面的yar包,但不懂怎么编译成dll,博主可以给个dll的下载地址吗
- 2012/11/14, pangee writes: 好牛B的样子,看的热血沸腾
- 2012/11/21, 风起 writes: 求dll文件
- 2012/12/01, 进进 writes: 鸟哥
PHP Fatal error: Uncaught exception 'Yar_Client_Protocol_Exception' with message 'malformed protocol header, maybe not responsed/sent by a yar rpc server/client?'
肿么回事儿啊
server
handle();
?>
client
api("parameter");
var_dump($result);
?>
- 2012/12/06, 关于PHP的编译和执行分离 | 5iphp writes: [...] Yar – 并行的RPC框架(Concurrent RPC framework) [...]
- 2013/02/26, xuchanglong writes: 鸟哥,我一直有个疑问
PRC和HTTP除了不同语言间调用以外还有什么优势?
据我所理解的如下:
yar的PRC是需要PHP启动监视进程的
而HTTP是用nginx或者其他web服务
监视进程处理能力并发有的时候就是很强,但是同时需要类似zookeeper一样的东西在高并发的时候多启动监视进程,或者罗机器
- 2013/04/29, Yar – 并行的RPC框架(Concurrent RPC framework) | 午后小憩 writes: [...] 本文地址: http://www.laruence.com/2012/09/15/2779.html [...]
- 2013/04/30, PHP & “Data” URL scheme | 午后小憩 writes: [...] Yar – 并行的RPC框架(Concurrent RPC framework) [...]
- 2013/05/01, 请手动释放你的资源(Please release resources manually) | 午后小憩 writes: [...] Yar – 并行的RPC框架(Concurrent RPC framework) [...]
- 2013/05/01, Yaf的一些资源 | 午后小憩 writes: [...] Yar – 并行的RPC框架(Concurrent RPC framework) [...]
- 2013/05/02, PHP的Calling Scope | 午后小憩 writes: [...] Yar – 并行的RPC框架(Concurrent RPC framework) [...]
- 2013/05/18, match these midi dresses with a large bag10 writes: Howdy! This is my first comment here so I just wanted to give a quick shout out and tell you I truly enjoy reading through your posts. Can you recommend any other blogs/websites/forums that deal with the same subjects? Appreciate it!
- 2013/06/08, learsu writes: 鸟哥,yar的设计理念communication between PHP applications/It has the ability to concurrently call multiple remote services.很像Gearman,不知道理解的对不对。
- 2013/06/08, Yuting writes: 鸟哥的测试脚本有点问题, 修改下 Api::api() 方法成别的就ok了, 否则会被认为是 __construct();
class API {
/**
* the doc info will be generated automatically into service info page.
* @params
* @return
*/
// 默认就会调用api接口, 相当于 __construct();
public function api($parameter, $option = "foo") {
}
protected function client_can_not_see() {
}
}
$service = new Yar_Server(new API());
$service->handle();
?>
- 2013/06/16, jeryu writes: 鸟哥,看到1.1.0版本支持TCP/UNIX以及持久链接了,但是github说明文档没更新啊,可否给个简单的例子介绍一下用法。
- 2013/07/09, 贾晨 writes: 鸟哥,有时间能出一套讲解源代码的手册或者资料什么的吗?
- 2013/07/17, chs writes: 鸟兄,刚试了一下YAR,有一个疑问请教一下。
客户端在调用时,程序会卡在loop这行。。。不知是我程序写的不当还是本就如此??我最初的理解是程序会继续顺序执行下去,直到某一个请求后自动执行回调函数;这样的效率会更高吧?请赐教。。。
- 2013/07/26, 新型序列化类库MessagePack,比JSON更快、更小的格式 | LAMP | 何跃的博客 writes: [...] 这个MessagePack的PHP扩展,是传说中的鸟哥Laruence开发维护的,在鸟哥的Yar中,也使用了MessagePack 作为打包协议之一。 [...]
- 2013/10/06, 霡霂 writes: 教主是谁。貌似很厉害的样子。
- 2013/10/08, h3110c writes: 鸟哥知道是否有并行调用rest api的东西?
- 2013/12/05, liangh writes: 可惜木有 dll .不知道何时可以有
- 2013/12/13, tree 的博客 » Yar的学习,以及生成环境中的运用(phpcms) writes: [...] 首先查看了鸟哥的文章 Yar – 并行的RPC框架(Concurrent RPC framework) ,对Yar的基本原理有了一个认识,做了一个简单的请求页面,具体见鸟哥博客,没问题,接下来就是对现有项目的改造了。 [...]
- 2014/01/20, deeka writes: Yar已经被集成到ThinkPHP去了,呵呵!
http://www.thinkphp.cn/extend/529.html
- 2014/03/17, 啃冰 writes: 第二段代码少了个冒号
- 2014/03/17, 啃冰 writes: 更正楼下:冒号->双引号
- 2014/03/26, munggruel writes: 我windows下,php5.4 nts yar dll扩展,碰到相同问题,怎么解决
PHP Fatal error: Uncaught exception ‘Yar_Client_Protocol_Exception’ with message ‘malformed
- 2014/08/08, 高华 writes: 鸟哥,yar只能走http协议吗?
这样是不是太重了,可以走轻点的协议吗?
- 2014/09/08, disturbed stricken writes: of course like your web site but you have to take a look at
the spelling on quite a few of your posts. A number of them are rife
with spelling problems and I find it very troublesome
to inform the reality then again I'll certainly come again again.
- 2014/09/20, 周智超 writes: 鸟哥,我使用您的demo报了个异常,如下
malformed response header '
Warning: Missing '
不太清楚是为什么,求赐教
- 2015/01/29, 哈娱 writes: 我使用的环境是php 5.6.6 x86 线程安全版,在windows 上安装了php_yar-1.2.4-5.6-ts-vc11-x86.zip 和 php_msgpack-0.5.5-ts-vc11-x86.zip 扩展,将php_yar.dll 和 php_msgpack.dll 两个文件放到ext扩展目录,配置了php.ini文件后重启apache,然后在打印的phpinfo信息中找不到这两个扩展信息,不知道问题处在什么地方?
在使用测试yar php实例时,提示错误:Fatal error: Class 'Yar_Server' not found。
- 2015/03/11, bailu writes: 上面的兄弟检查下php禁用函数列表里是不是有个proc_get_status被禁用了。如果不是这问题,安装扩展的时候make test检查下报错信息
- 2015/06/15, cox writes: 这个是只能在命令行下运行吗?
Related posts:
Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)Related Posts: