《架构师之路:架构设计中的100个知识点》
19.脚本语言使用长连接的一种思路
脚本类语言,例如PHP,不能像C++/Java那样能搞服务常驻内存,不能搞长连接?
为什么脚本语言要搞长连接?
脚本类语言每次访问后端数据库,服务,缓存,都需要经历上述四个步骤:
1. 建立连接;
2. 发送数据;
3. 接受数据;
4. 销毁连接;
在吞吐量很高的情况下,TCP建立与断开连接的开销不能忽略了,有可能成为性能瓶颈。
像PHP可以用swoole来优化解决,但其仅限于PHP。 脚本语言有没有通用的长连接优化方法呢?
那你可以搞一个 本地服务local-proxy,PHP与本地服务利用 UDS通讯,本地服务与缓存用TCP长连接通讯。这样脚本语言就可以避免每次访问缓存建立连接销毁连接。
什么是UDS?
UNIX Domain Socket,是一种进程间IPC通讯机制,它不需要经过网络协议栈,不需要打包拆包、不需要计算校验和等,它只是将应用层数据从一个进程拷贝到另一个进程。它可以用于同一台机器上两个没有亲缘关系的进程通讯,不但 全双工,还 保证消息不丢,不重,不错乱。
如上图所示,我们在PHP应用服务器上部署一个local-proxy:
1. PHP与local-proxy之间使用UDS通讯;
2. local-proxy与缓存之间用TCP长连接通讯。
local-proxy的实现要点是什么?
1. 没有任何业务逻辑,只转发请求;
2. 复用缓存协议,这样调用缓存的业务代码不需要大幅度修改。如果封装了缓存访问client,只要要升级client,将访问缓存升级为访问 local-proxy,这样业务代码甚至都不用动。
你会发现,非常非常多基于server实现的缓存,数据库中间件,都是这两个思路。
知其然,知其所以然。
思路比结论更重要。
补充阅读材料:
《Swoole:PHP 协程框架》
https://www.swoole.com/
不多介绍了,硬生生为PHP续命的技术。返回搜狐,查看更多
责任编辑: