最近有个需求是统计各个项目接口的请求数据,包括接口的返回状态码(成功率)、uri、请求时间、响应时间、ip等数据。有一个要求就是不能影响使用接口的业务。
这个项目主要分四个部分。
1、server,响应客户端的请求,过滤相关数据放到redis。请求量可能过大,会导致server挂掉,所以启用了3个进程来处理请求,每个server启动了相应的worker数量和task数量;server采用了php的swoole扩展的udp,工作流程是请求到达server,server分配请求到worker,worker响应请求,worker启动task处理数据,(这个业务实际上没有必要启动task功能,但是启动task不影响)
2、script,为防止redis数据量过大,每天有4个定时任务,定时处理redis的数据,并插入数据库,数据库采用分表技术,每3个月分一张表,分表任务交给脚本初始化时处理。
3、web,管理各个应用,监控server的使用情况,查看各接口数据,待做
4、sdk,提供客户端使用,采用stream流的方式发送udp请求,这里使用udp的原因是因为无需等待服务端的响应,但是为了防止服务挂掉,sdk采用轮训并且有超时重试机制,这个端口没有发送成功,将更换另一个端口尝试,如果三个端口都不行,则发送失败。
下面先讲一下客户端的接入。
1、数据采集
ip、请求时间:php的$_SERVER会有个REQUEST_TIME_FLOAT精确到毫秒级记录请求的到达时间
状态码:一般api项目都会有统一出口,所以在统一出口处采集状态码并调用sdk,并发送数据到server
响应时间:有请求时间的情况下,这个值就不难获取
-------------------------------------------------------------------
这个项目暂时投入在一个项目上使用,以后继续完善,其他点以后继续补 2016.11.01