Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请教一下性能的问题 #28

Closed
forgottener opened this issue Oct 20, 2016 · 8 comments
Closed

请教一下性能的问题 #28

forgottener opened this issue Oct 20, 2016 · 8 comments

Comments

@forgottener
Copy link

最近用hprose做服务,测试程序中以前的业务逻辑不变,只是多加了hprose;

//上面是老逻辑代码
$hprose = new Client("tcp://0.0.0.0:1314", false);
$hprose->test();

test()方法有涉及到逻辑处理有一定性能开销的,我想知道这个new [Client()的性能开销大不大的?压测了下感觉原来的代码性能降了很多;
没加hprose:
image

加了hprose:
image

还有问下有什么技术手段,可以让这个new的Client不用频繁的实例化?1000个用户的http请求就是new1000次了,会产生1000个tcp连接,这种并发高了咋办?

@andot
Copy link
Member

andot commented Oct 20, 2016

可以安装 hprose-pecl 来提高序列化、反序列化的性能。这个对于数据比较大的复杂数据性能提升很明显。

然后就是用 hprose-swoole 来做服务器,可以避免创建多个客户端,只需要一个客户端就可以代理所有请求了。

@forgottener
Copy link
Author

需要在每台服务器上安装hprose-pecl、swoole扩展吗?我用hprose的出发点是为了避免其他项目的服务器需要安装各种扩展

@andot
Copy link
Member

andot commented Oct 22, 2016

用到 hprose 的服务器安装 hprose-pecl,使用 php-fpm 的客户端不需要安装 swoole 扩展,这两个扩展安装都很容易直接使用:

pecl install hprose
pecl install swoole

命令安装就可以了。

@forgottener
Copy link
Author

swoole的客户端不装swoole扩展好像不行吧?你的意思是做http接口给其他项目调用?

@andot
Copy link
Member

andot commented Oct 22, 2016

swoole的客户端只能用于命令行下面,在 php-fpm 下面只能使用 hprose-php 下面的客户端,这里面也有 TCP 客户端的。hprose-php 的 TCP 客户端(这个客户端不需要扩展)同样可以连接 swoole 的 TCP 服务器。

@forgottener
Copy link
Author

forgottener commented Oct 22, 2016

多谢大神耐心指导,"用 hprose-swoole 来做服务器,可以避免创建多个客户端,只需要一个客户端就可以代理所有请求了。" 我不太明白这句话后面的意思,只做一个客户端用来代理请求,那么这些请求是怎么到这个客户端的?用http服务RESTful吗? 我有这样的业务场景:
首先是一台提供RPC方法的hprose服务器A(192.168.1.1), 然后有X,Y,Z 3个项目,3个项目是对用户开放的网站服务,比方说X,Y,Z有个登录场景都需要调用A服务器的a()方法,那么我目前没想明白的地方是,X,Y,Z都需要通过$hprose = new Hprose\Socket\Client("tcp://192.168.1.1:1314", false) 来得到一个$hprose客户端,再通过'$hprose->a();'来调用A服务器的a()方法,这样的话X,Y,Z项目中,每一次用户通过http请求进来做登录时都需要new hprose的客户端出来吧?
你提到的代理所有请求是怎么做到的?是再在服务器A(192.168.1.1)单独开启一个http服务(http://192.168.1.1/a))吗?让X,Y,Z通过请求http://192.168.1.1/a服务的RESTful api,然后由A再去执行a()方法? 那这种情况下X,Y,Z项目都不需要引入hprose了,这不像RPC了吧,这感觉是SOA接口了

@andot
Copy link
Member

andot commented Oct 22, 2016

你的意思是这个对吧:

+---------+      +------------+      +---------------+
| Browser |----->| Web Server |----->| Hprose Server |
+---------+      +------------+      +---------------+

你的 hprose 客户端是在 Web Server 上。

其中 Hprose Server 如果是基于 swoole 的,那么这个服务器会很快,使用 TCP 方式发布服务就可以。

而 Web Server 如果本身也用 swoole 来实现的话,那么这部分就可以用 hprose-swoole 的客户端来做,这种情况下,这个地方的客户端只需要一个就可以了。

而如果 Web Server 不是基于 swoole 来实现的,而是使用 nginx、IIS 等服务加 php 来实现的话,那么就只能使用 hprose-php 的 Hprose\Socket\Client 了,这种情况下,确实只能每个请求创建一次客户端,但是如果你创建的是 hprose 的异步客户端的话,那么它跟 hprose 服务器的连接是 STREAM_CLIENT_PERSISTENT 的,所以在多请求之间也可以被复用,而且异步客户端支持全双工模式,可以在单个连接上同时进行多个调用,比同步客户端要高效。所以如果想要提高效率,可以考虑使用 Hprose\Socket\Client 异步客户端模式,结合 hprose 中的协程,使用异步客户端的程序代码也不会太难写。

一般来说,如果你传输的数据比较复杂,那么传输慢的主要原因是序列化和反序列化比较慢,只需要安装一下 hprose-pecl 扩展就可以解决。

@forgottener
Copy link
Author

明白了,太谢谢你了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants