PHP RPC框架基于Redis实现的流量控制系统
我们对项目模块进行了一定程度的微服务化改造,之前所有模块都放在一个项目里(一个大文件夹),线上部署也一样,这样的缺点显而易见。 后面我们按照业务功能拆分成一个个的子模块,然后子模块之间通过RPC框架进行访问,各个子模块有各自独立的线上机器集群、mysql及redis等存储资源,这样一个子模块出问题不会影响到其它模块,同时可维护性,扩展性更强。
但现实中每个子模块的服务能力是不同的, 如下图按子模块拆分之后的架构图所示,假设到达A模块的QPS为100,A依赖于B,同时每一个A模块到达B模块的请求QPS也为100, 但B模块所能提供的最大QPS能力为50, 如果不进行流量限制,则B模块因为超过负载而流量堆积导致整个系统不可用,我们的动态流量控制系统就是找到子模块的最佳服务能力,即限制A模块到达B模块的流量为50QPS,则至少保证一部分请求是能够正常进行的,而不会因为一个子服务挂掉而拖跨整个系统。
我们的RPC框架是一个PHP实现的框架,主要支持http协议的访问。对于一个前端A模块来说,对于依赖于的后端B模块, 需先对B模块进行服务化配置,再按服务名字进行引用访问,服务配置一般形式如下:
[MODULE-B] ; 服务名字
protocol = "http" ;交互协议
lb_alg = "random" ; 负载均衡算法
conn_timeout_ms = 1000 ; 连接超时,所有协议使用, 单位为ms
read_timeout_ms = 3000 ; 读超时
write_timeout_ms = 3000 ; 写超时
exe_timeout_ms = 3000 ; 执行超时
h