快速建立基于HTTP协议的高性能数据查询服务器

原文链接

邮件指纹识别是可以有效识别垃圾邮件的反垃圾技术之一,其反垃圾的步骤如下:一、网关对所有邮件的指纹信息进行收集;二、网关中心负责统计所有网关收集的指纹信息;三、网关中心将统计结果下发给各个网关,新邮件进入网关时,根据新邮件指纹和指纹统计结果进行比较分析判定邮件是否垃圾。

为了可以更好地识别临时爆发的垃圾邮件,理想的邮件指纹统计应该是实时的。综合考虑性能要求和实时性要求,目前的系统每个小时发布一次最新的邮件指纹数据。在信息发布过程中,如果直接同步复制指纹数据给各个网关,显然将消耗巨大的网络带宽,并且给网关中心服务器带来沉重的负担。为了节省带宽,减轻网关中心服务器的压力,我们根据网关服务器地理区域划分,在各IDC各建1到多个的指纹数据查询服务节点,各查询服务节点与网关中心指纹统计服务进行同步复制;指纹数据查询节点为网关服务提供邮件指纹信息查询服务。大概部署图示如下

图1:邮件指纹查询服务工作示意图

        服务端使用Apache进程/线程混合服务器模型,由Apache实现数据的接收、发送以及进程管理等工作,用户只需要开发自定义的Apache处理模块实现数据交互响应的功能。

        邮件指纹查询服务的数据传输使用已有的HTTP协议,客户端API使用libcurl完成协议数据封装、发送、接收。

        系统使用Protobuf对查询数据和结果进行序列化和反序列化,使用二进制数据作为HTTP的BODY进行传输,可以达到简化解析过程、减少传输数据大小,提高解析速度的效果。一般地,使用Protobuf比使用XML数据小3-8倍,数据处理速度更比XML解析快20-100倍。

        另外,系统还通过自定义HTTP头发送指纹服务相关信息,查询命中缓存情况等信息。

        以下简介Aapache模块的编写方法,编写简单的Apache模块,我们可以定义:

module AP_MODULE_DECLARE_DATA fba_module = {
STANDARD20_MODULE_STUFF,
NULL,
NULL,
fba_config_server_create,
NULL,
fba_cmds,
fba_register_hooks
};

        其中,fba_config_server_create,fba_cmds用于加载和验证自定义的配置信息,fba_register_hooks用于注册自定义的挂钩函数。可以在register函数中声明自定义模块的各个阶段的处理函数:

static void fba_register_hooks(apr_pool_t *p)
{
ap_hook_child_init(fba_child_init, NULL, NULL, APR_HOOK_FIRST);
ap_hook_handler(fba_handler, NULL, NULL, APR_HOOK_FIRST);
}

        Apache2.X提供了约21个可用的钩子函数,其中ap_hook_child_init是在worker进程启动后执行的函数,我们在这里初始化线程共享的资源池,ap_hook_handler是在连接处理线程接收客户端信息结束后执行的函数,我们在这里需要反序列化请求信息、完成数据查询、序列化查询结果,然后将返回结果信息交给Apache,由Apache完成向客户端发送数据。

        客户端API、Apache、自定义模块之间的运行流程可以参考下图,

 

图2:邮件指纹查询服务处理流程

         当然,自定义模块开发过程还有很多需要注意的地方,如APR在模块编程中的应用,Apache的内存池管理等,更多的信息可以参考官方开发文档,或者阅读《Apache源代码全景分析》也是个不错的选择。

        最后一个重要的问题就是如何提高系统的并发查询性能。

根据当前网关系统的运行情况计算,每个数据查询服务节点需要支撑80台网关服务器的查询,以每台服务器每天接受20万封邮件,每封邮件查询3次计算,需要达到的并发数量为:

并发数K=80(每个节点服务器个数)* 20万(服务器每天邮件数)*3(邮件查询数)/ 86400 = 555次/秒。

为了尽可能的提高并发数量,指纹服务系统采取了如下的设计:

  1. 服务器端使用memcached对查询结果进行缓存。
  2. 客户端API支持使用客户端memcached缓存查询结果。
  3. 将原始的邮件指纹数据载入内存,以加速未命中缓存数据的查询。
  4. 对原始的邮件指纹数据进行分块处理,根据查询数据值可以直接定位数据块,缩小查找范围,加快查找速度。
  5. 系统采用线程/进程混合模型,对于可重用的资源实现线程间共享。

        综上,系统通过简化服务实现方式,利用Apache高性能高可用的服务能力,编写简单的Apache数据处理模块,结合Memcached、内存加载等IO优化手段,实现满足运营需要的指纹服务架构要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值