您的位置:首页 > 其它

YAR 并行RPC框架研究

2016-06-30 16:24 169 查看
前几天,部门召开了PHP技术峰会 学习会议,大家分别对这次会议的PPT 做了简单的介绍,

其中提到了 鸟哥【惠新辰】的一篇PPT《微博LAMP 演变》,如果谁有需要可以去谷歌搜,或者去
http://www.laruence.com/2013/08/15/2913.html 他的博客去看一下,我就不提供下载链接了。

这篇PPT中提到了几个点: Yaf,Yac,Yar;我们会后也分任务对这些去做一些了解。

我选了Yar,去年5月份,因为一淘首页要做一次Bigpipe的改版,我用C写过一个并行化的PHP扩展,

对这些比较熟悉,就拿来对比一下。

好吧,步入正题:

Yar:yet another rpc,这是它的全称。

关于一些基本介绍 http://www.laruence.com/2012/09/15/2779.html 可以去 鸟哥的博客去了解下。

我也简单介绍下用法,下面的代码来自鸟哥的博客。

实例化 Yar_server的时候,需要传递一个对象,然后会将我们提交的参数作为 这个对象的method来使用,其实这个做法就相当于是一个

简单的路由功能,它巧妙将 doc作为api的接口说明来使用,让我们get直接访问server.php的时候,看到的会是下面的页面:




整体来讲,yar分为两部分:server和client.

Server端:

上面有讲到server可以理解为一个简单的路由,它只是将我们的对象作为一种服务接口来使用,

它的主要流程如下:

实例化Yar_Server时,传递一个自定义API对象,将这个对象保留在 属性 _executor中,调用handle方法,

如果不是post请求,则只输出接口说明;

如果是post请求,接收api函数,读取post数据,检测 API对象中是否存在此方法,

如果存在就call_user_function_ex来执行此方法,如果不存在bailout。

看下代码

关键部分已经加了注释,代码写的也通俗易懂。

那现在看Client了:

我之前做的其实就相当于这个client,没有server端,只是用libcurl+epoll的事件模式去curl我们的接口,有数据返回时,执行

callback函数,看了yar代码之后,发现 ,思路其实很相似。

使用方法 :

Yar_Concurrent_Client::call方法接收四个参数,

第一个是访问的接口地址,

第二个是需要执行的方法,

第三个是传递的参数,

第四个就是回调函数。

还有第五个参数,一个数组,它用来设置options,默认为空。

这些所有信息保存在 _callstack属性中。

由Yar_Concurrent_Client::loop()统一发送 接收epoll事件,当发现有一个读事件时,读到所有数据然后调用callback。

在扩展实现中有一个数据结构:

他保存所有call设置的参数,在执行loop时,会从这里拿这些信息,

client关键的地方在php_yar_concurrent_client_handle函数中:

在这之前,有几个比较重要的数据结构:

上面的函数指针代码量比较大,我就不贴代码了。

下面看 php_yar_concurrent_client_handle喊。

在执行multi->exec 时,如果所有数据已经读取成功,就会调用 php_yar_concurrent_client_callback函数,它也是执行 call_user_function_ex的地方,这样我们设置的callback函数也就执行成功了。

Client 看代码的过程比较绕,原因就是上面的几个结构,
yar_transport_t;
yar_transport_multi_t;
yar_transport_multi_interface_t;
yar_transport_interface_t;

关键的是yar_transport_multi_t和yar_transport_interface_t,

我们要并行几个接口,创建几个 yar_transport_interface_t结构,它保存了curl_easy句柄,

yar_transport_interface_t 创建完成后,调用 yar_transport_multi_t->php_yar_curl_multi_add_handle函数,将

yar_transport_interface_t 指针添加到yar_curl_multi_data_t->chs中,所有的curl句柄添加完后执行

yar_transport_multi_t->php_yar_curl_multi_exec,执行epoll事件模型,所有数据读取结束后 调用

yar_concurrent_client_callback执行我们传递的callback函数,就是这样。
http://www.imsiren.com/archives/867
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: