开源项目:基于UDP协议的日志记录系统(LogDarts)

@李彪  July 18, 2018

背景介绍

日志对于任何一个需要稳定运行的系统都弥足珍贵,如何构造一个高性能的统一日志平台,首先需要解决的是“记录”,如何用最快、性能损耗最小的方式来记录日志?
UDP是一个不错的选择:首先UDP通道的带宽需求小,能达到很好的实时性;其次UDP不需要维持连接,在网络传输中的动作少。

有人会说,UDP是不稳定传输、使用时数据风险大。对于这点,我们需要考量具体使用环境,在我们的日志系统中,每台机器都会运行一个LogAgent,你可以把它想像成数据接受转发者,LogAgent接受本地客户端发来的UDP数据包、并把数据包通过稳定传输协议传输到统一日志中心,而且随着网络不断发展,网络状况也在逐渐改善。

CDN服务商Akamai(NASDAQ: AKAM)报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍。网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。

LogDarts 开源项目就是建立在上述的使用环境下,它可以帮助使用PHP开发的系统快速集成UDP日志客户端功能。

项目地址: LogDarts-noComposerLogDarts

项目组件

LogDarts 开源项目包含CONF、EXP、PACKER 和 LOGER 四个组件。

CONF组件

顾名思义,它是配置组件,主要负责UDP客户端的配置文件、配置文件目前包括UDP配置、数据打包配置、数据发送配置。

  1. 数据打包配置里 ‘MAX_SIZE’ 参数代表UDP数据包最大长度、默认值为1400,
  2. 数据打包配置里 ‘SAVE_TYPE’ 参数代表数据保存模式,默认值为‘STATIC_VAR’,后期还会支持 SHM 和 APCU
  3. 数据发送配置里 ‘MODE’ 参数代表数据发送模式,有 ‘SIMPLE’ 和 ‘GROUP’ 两种,前者代表每次都发送,后者代表分组发送,后者可以有效降低UDP请求次数。

EXP组件

EXP组件主要包装项目中可能出现的异常。

PACKER组件

此组件负责组装数据包字符串、目前主要记录两类数据,相应的数据格式如下:

  1. 计数型: php_biz_count_metrics|type=payorder&service=shein&site=iosus|1
  2. 瞬时型: php_biz_gauae_metrics|type=order.payorder&service=shein&site=shein&biz_parameter=facebook7|2.15

LOGER组件

LOGER是最重要的组件,主要SDK提供者,帮助用户记录日志和发送日志

使用方法

使用流程

加载 loader.php ==> 获取Loger对象 ==> 使用count方法进行发送计数日志 (使用set方法发送瞬时日志)。

样例代码

<?php

require_once  __DIR__ ."/../src/loader.php";

$loger = Loger::getLoger();
$ret = $loger->count('shein',['order','payorder'],'iosus1');  
$ret = $loger->set('shein',['order','payorder'],'shein',2.15,'facebook7');

?>

性能测试

对组件利用xhprof 进行性能跟踪,具体情况如下图。组件所消耗的CPU时间还是很小的,一个执行流程能够控制在400微秒以下。


评论已关闭