* 服务化框架:
- 内部模块服务化 rpc
- alibaba HSF dubbo(Java)
- Facebook thrift (C++, Java, Python, ruby, php)
- google grpc
- twitter finagle
- php swool
* 为什么要自己造轮子
- 简单可控,自成体系: 采用标准数据格式: URL + JSON
- 高性能要求和追求
- 只有rpc还不够
* PSF 架构示意图
* 架构解读
- service center服务注册和服务发现 负载均衡
- 多台service center机器相互独立
- client直连和service机器连接和通信
- 基于连接数的负载均衡
* PSF server工作机制
* 工作机制解读
- client和service通过socket通信
- manager进程和worker进程通过pipe通信
- manager进程为C进程
- worker进程为php进程。用C实现基于pipe通信的处理框架,调用php处理函数
* PSF特点: 高效灵活
- powered by C: 用C实现php rpc应用服务器, C接管了网络连接和网络IO, 性能好,框架层面不存在性能瓶颈
- 改变php运行方式: php以后台daemon方式高效运行
- 简介高效的协议: 采用IP直连的长连接
* PSF对比web server优势明显
- daemon vs request
- 不需要负载均衡层
- 不需要域名解析
- 协议非常简洁,协议头只有10字节。没有臃肿的http header, 如 accept、host、content-type、Content-Length etc.
* PSF IO性能优势
- linux epoll 封装, 支持FreeBSD 和Solaris
- 每个链接预分配buffer
- 网络超时管理使用时间轮
- 日志定时刷到硬盘
* PSF依赖的基础库
- libfastcommon
- libserverframe
* PSF 程序以及php扩展
- psf-server: psf_server_managerd, psf_service_centerd
- psf-tool: psf_stat, psf_server_stat, psf_client_call
- psf_server_worker
- psf_client_sdk
- psf-tsar-module: tsar插件
* PSF 原生service编写
<?php
$start = $argc - 4;
$read_fd = $argv[$start];
$write_fd = $argv[$start + 1];
$handle = psf_worker_init($read_fd, $write_fd, function($service_uri, $data) {
// ...
});
psf_worker_loop($handle);
* service 中使用全局变量
- 尽可能兼顾web程序开发方式
- 支持url方式,注入$_REQUEST自动识别body中的URL encoded数据
- 支持HTTP header, 注入$_SERVER
* PHP RPC 框架
psf_php_client_sdk_call('driver', ‘auth/ checkSession?user_id=12345&sid=888888’, ‘’, 30);
class file:Driver/Service/Auth/Auth.php
class Auth {
public static function checkSession($params, $data) {
// ...
}
}
* PSF发展历程
2014年9⽉月发布第⼀一个版本
• 使⽤用PSF的模块(10+):
1. 设备认证 2. ⻛风控系统 3. 消息中⼼心 4. 设备中⼼心 5. 新订单 6. 新派单
* 订单和派单系统重构
• 使⽤用PHP 7.0
• PHP服务进程数40-80
• PHP本地缓存:ConfigCache • 后端资源全部采⽤用⻓长连接
DB:DBConnection & DB & PartitionDB
Cache:PartitionRedis
* DBConnection简介
• 连接复⽤用:连接基于DB机器,⽽而不是database
• DBConnectionCache
* PartitionRedis简介
• 采⽤用 M * N⽅方式,配置简单
• 数据分⽚片,按key求模
• failover机制:所有机器构成⼀一个 环,后为前备
• 数据预热加载机制:onConnected 回调函数
* 性能表现
• 设备中⼼心:单机峰值QPS达到 20k,
平均RT不到0.5ms
• 新⽼老订单系统对⽐比:
RT:30ms vs 3ms 机器数:20台 vs. 5台
SoftCon2016 PHP