Yar(yet another RPC framework)是一个PHP扩展的, RPC框架。

RPC即远程过程调用协议。它是一种通过网络从远程计算机程序上请求服务的协议,使得网络分布式多程序的应用程序更加容易。也就是说在应用程序分布式部署的时候,通过RPC这种协议去做通信请求。RPC采用客户机/服务器模式。

而Yar就是这样一个RPC框架。它的服务器分为两种,一种是Yar-PHP,一种是Yar-C。有的应用需要大吞吐量,比如搜索用户,这时用Yar-PHP去写服务(这里应该指的是用PHP写的RPC请求)显得不是很合适,效率比较低,或者可能用PHP是不能完成的,这时需要用Yar-C来完成,也就是用C来写的RPC请求。既然有两种方式写服务,那么理论上应该把两种方式封装起来。也就是Yar了。

那么产生Yar的原因是大概是这样的。当应用越来越大时,就必须解耦,加上微博用BigPipe,逻辑上也是分Pagelet的。所以,目前的加载首屏的方式是:请求还是先发送到前端机,前端机相当于一个路由一样,分析请求都用什么模块,然后去请求有这些模块代码的机器。理论上,每个模块都有一部分机器负责着。去请求代码的过程就需要Yar来完成。也就是前端机与服务器通信,传递代码的通道。如上一段所说,如果这个模块逻辑需要大吞吐的,就用Yar-C去写这个Pagelet服务器的服务。一般的用Yar-PHP去写。而前端机作为客户端只需写好客户端代码,如:要请求的是Yar-C服务的,就在配置的时候写tpc协议(这相当于是Yar框架的配置参数)。其中,访问用Yar-C的服务器与Yar-PHP的不同是:用PHP写的相当于是http请求,因为是web服务。而用C写的,则不是HTTP请求,是Yac自定义的协议(HTTP协议于此其实是冗余的,自定义的协议非常轻量级)(直接socket通信?)。

用Yar,QPS(每秒查询率)达到了万级。类比的软件如Thrift。

上面提到的一些名词:

RPC:远程过程调用协议
QPS:每秒查询率 
Msgpack :一个高效的二进制打包协议,如JSON是一种轻量级的数据交换格式一样,是通信用的一种数据格式的规范协议。
Thrift :同Yar的功能,支持多语言,IDL,包比Yar小,性能略微低一些。

另外:记录一下BigPipe相关:

微博第一期的BigPipe实现是串行的,也就是说按照加载顺序去顺序执行计算Pagelet的工作,计算完一个输出一个,再计算下一个。事实上这种方式在总计算时间上是比不用BigPipe的慢的,因为去解耦代码,再加上BigPipe的代码,本身就会降低计算速度。这应该也就是为什么模块很少的话,就不要去用BigPipe了的原因吧。

而第二期实现了并行的BigPipe。也就是说几个Pagelet并行计算,哪个先算完,哪个显示,浏览器,也就是客户端并不会关心加载顺序。网速不错的话,看不出顺序,并且Feed本身就慢吧,所以每次看到Feed最慢也是合理的。

变成分布式,并行计算的Pagelet的方式就可以把它们的代码分布在许多机器上了,所以要通信拿结果的话就用Yar了呢。

+++++++++++++++++++++++++++++

这次的分享,很多收获,因为讲得很浅显,大概知道了分布式机器的通信,可能有些含义有误解————不是很懂的情况下听就会产生很大误差。还是很多东西不是很了解啊,皮毛也没有,而且我PHP业务逻辑的代码都还没有看完,刚刚装上Yaf而已呢。

哎,还是要继续努力啊少年!

参考资料:

Yar – 并行的RPC框架(Concurrent RPC framework

记于2014年01月08日 EOF