画外音:phper说,不服可以点赞来辩。

如果站点架构知足以下几点:

利用php这类脚本措辞开拓须要连接后端做事,例如RPC做事、memcache、redis等流量非常大

此时,通过短连接访问RPC做事、mc、redis会涌现什么问题呢?

php长连接谁说php不克不及搞长衔接 Ruby

范例的web架构如上:(1) 最前端是APP或者web页面;(2) 做事器上层是web-server进行接入;(3) php调用后端,完成业务逻辑,拼接页面;(4) 末了端是做事、缓存、数据库;

php作为脚本措辞,不像C++/Java那样进程常驻,以是它连接后真个做事都是利用短连接。

画外音:有朋友说,可以用C写扩展?

上图是一种范例场景,站点php支配在机器A上,缓存memcache支配在机器B上,之间通过短连接通信,过程为:(1) php建立tcp短连接;(2) 按照memcache协议发送数据;(3) 吸收memcache返回的数据;(4) php关闭tcp短连接;

在流量小时,上述过程没有任何问题,当网站流量非常大的情形下,短连接可能会成为性能瓶颈,有什么优化办法吗?

画外音:建立连接,销毁连接很耗时。

话锋一转,什么是UNIX Domain Socket?UNIX Domain Socket是一种IPC机制,它不须要经由网络协议栈,不须要打包拆包、打算校验和、掩护序号和应答等,只是将运用层数据从一个进程拷贝到另一个进程。

画外音:IPC, Inter-Process Communication, 进程间通信。

它可以用于同一台主机上两个没有亲缘关系的进程,并且是全双工的,供应可靠通报(不丢失、不重复、不错乱)的IPC机制。

画外音:亲缘关系是指,父子进程或者兄弟进程这种“分外的”进程关系。

可以看到,UNIX Domain Socket的效率会远高于tcp短连接,但它只能用于同一台主机间的进程通讯,而php运用和后端做事每每是支配在不同的机器上的,此时能否利用它来进行优化呢?

优化后的大略单纯架构图如上:

(1) 在php运用做事器上支配一个local-proxy;

(2) php与local-proxy之间利用UNIX Domain Socket来通讯;

(3) local-proxy与后端做事进行TCP长连接通讯;

这样就大大提升了通讯效率,免除了每次要求都要进行的建立与关闭tcp短连接的开销。

实现local-proxy有什么要把稳的?

local-proxy非常看重通用性设计,由于php有RPC、mc、redis等多种后端:

协议设计:local-proxy本身没有任何业务逻辑,只卖力要求转发,上游发送过来redis协议,透传给后真个redis

画外音:这样,上游客户端不须要进行任何代码修正。

通讯办法:如上文所述,local-proxy与上游利用UNIX Domain Socket进行通讯,与下贱利用tcp长连接进行通信高效框架:这种方案是为理解决tcp短连接的效率损耗,这样对local-proxy的效率哀求就非常高,可以选用成熟高效的网络框架和tcp长连接连接池技能来实现

画外音:例如libevent。

要求映射:须要将上游发过来的要求与发往下贱的要求逐一映射起来,这样才能精确的对应上要求包与相应包

思考过程比结论主要,希望对你有启迪。

来源:架构师之路

作者:沈剑

链接:https://mp.weixin.qq.com/s/bTSzsL269uqkGL_YC8iewQ