Unix Socket 代理服务 unix域套接字
基于Unix Socket的可靠Node.js HTTP代理实现(支持WebSocket协议) - royalrover - 博客园 https://www.cnblogs.com/accordion/p/12457505.html
实现代理服务,最常见的便是代理服务器代理相应的协议体请求源站,并将响应从源站转发给客户端。而在本文的场景中,代理服务及源服务采用相同技术栈(Node.js),源服务是由代理服务fork出的业务服务(如下图),代理服务不仅负责请求反向代理及转发规则设定,同时也负责业务服务伸缩扩容、日志输出与相关资源监控报警。下文称源服务为业务服务。
最初笔者采用上图的架构,业务服务为真正的HTTP服务或WebSocket服务,其侦听服务器的某个端口并处理代理服务的转发请求。可这有一些问题会困扰我们:
- 业务服务需要侦听端口,而端口是有上限的且有可能冲突(尽管可以避免冲突)
- 代理服务转发请求时,又在内核走了一次TCP/IP协议栈解析,且存在性能损耗(TCP的慢启动、ack机制等可靠性保证导致传输性能降低)
- 转发策略需要与端口耦合,业务移植时存在风险
因此,笔者尝试寻找更优的解决方案。
基于Unix Socket协议的HTTP Server
老实说,之前学习linux网络编程的时候从没有尝试基于域套接字的HTTP Server,不过从协议上说,HTTP协议并没有严格要求传输层协议必须为TCP,因此如果底层采用基于字节流的Unix Socket传输,应该也是可以实现要求的。
同时相比较TCP协议实现的可靠传输,Unix Socket作为IPC有些优点:
- Unix Socket仅仅复制数据,并不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不产生顺序号,也不需要发送确认报文
- 仅依赖命名管道,不占用端口