php使用tcp长连接的一种优化思路

php使用tcp长连接的一种优化思路

一、面向人群

如果站点架构满足以下几点,那么本文的优化方案会非常适合:

1)使用php等脚本语言作为开发语言

2)需要连接后端服务,例如RPC服务、memcache或redis等

3)流量非常大

二、解决的问题

常见的web架构如上:

1)最前端是APP或者web页面

2)服务器上层是web-server进行接入

3)php脚本语言调用后端数据,完成业务逻辑,拼接页面

4)最后端是服务、缓存、数据库

php是一种脚本语言,不像C++/Java那样进程能够常驻,所以它连接后端的服务都是使用短连接:

上图是一种典型场景,站点php部署在机器A上,缓存memcache部署在机器B上,之间通过短连接通信,过程为:

1)php建立tcp短连接

2)按照memcache协议发送数据

3)接收memcache返回的数据

4)php关闭tcp短连接

在站点流量小时,上述过程没有任何问题,当站点流量非常大,QPS很高的情况下,php对memcache的tcp建立+关闭tcp短连接的开销便不能忽略了,有可能成为性能的瓶颈,如何进行优化是本文即将讨论的核心。

三、UNIX Domain Socket介绍

话锋一转,先一起来看看UNIX Domain Socket技术。

UNIX Domain Socket是一种进程间IPC通讯机制,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。它可以用于同一台主机上两个没有亲缘关系的进程,并且是全双工的,提供可靠消息传递(消息不丢失、不重复、不错乱)的IPC机制。

四、优化方案

可以看到,UNIX Domain Socket的效率会远高于tcp短连接,但它只能用于同一台主机间的进程通讯,而php应用和后端服务往往是部署在不同的机器上的,此时能否利用它来进行优化呢,答案是肯定的。

优化后的简易架构图如上,在php应用服务器上部署一个local-proxy,php与local-proxy之间使用UNIX Domain Socket来通讯,而local-proxy与后端服务进行TCP长连接通讯,这样就大大提升了通讯效率,免除了每次请求都要进行的建立+关闭tcp短连接的开销。

五、local-proxy要点

要实现上述优化方案,local-proxy是实现要点,在实现local-proxy时,有这么几点需要注意

1)协议设计:local-proxy本身没有任何业务逻辑,只负责请求转发,上游发送过来memcache协议,透传给后端的memcache,这样的话,上游客户端不需要进行任何代码的修改

2)通讯方式:如上文所述,local-proxy与上游使用UNIX Domain Socket进行通讯,与下游使用tcp长连接进行通信

3)高效框架:这种方案是为了解决tcp短连接的效率损耗,这样对local-proxy的效率要求就非常高,可以选用成熟高效的网络框架(例如libevent)和tcp长连接连接池技术来实现

4)请求映射:需要将上游发过来的请求与发往下游的请求一一映射起来,这样才能正确的对应上请求包与响应包

==【完】==

回【可靠】微信为什么不丢消息?

回【http】http如何像tcp一样实时的收消息?

回【分区】互联网公司为啥不使用mysql分区表?

回【过载】如何实施异构服务器的负载均衡及过载保护?

回【接入】lvs为何不能完全替代DNS轮询

回【均衡】一分钟了解负载均衡的一切

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_阅读 5,931评论 0 3
  • 1、memcache的概念? Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨...
    桖辶殇阅读 6,765评论 2 12
  • php.ini设置,上传大文件: post_max_size = 128Mupload_max_filesize ...
    bycall阅读 11,808评论 3 64
  • 毎个人都是生而孤独的,从离开母体的那一刻,就开始了孤独而漫长的一生。哪怕是双胞胎,也是各走各的路。那些看起来合众的...
    瑞雪飘飘Maggie阅读 1,486评论 0 0
  • 哭不是放松! 哭不是解脱! 哭不是软弱! 哭不是懦弱! 哭不是谁的错! 而让你哭的人也不是错! 没有谁对谁错...
    光玉木子阅读 1,328评论 0 0

友情链接更多精彩内容