一种轻量的消息分析系统架构
系统架构
软件设计界有一句很经典的话:“大部分的耦合问题,都可以通过在中间加一层解决”。
参照MVC,可以把消息分析系统大致归结为接入层、数据层、分析层、服务层。其中数据层主要是各种冷热数据的存储及检索的构建,服务层对应view,主要是前端的展示,分析层对应各种后台离线、在线分析。
数据流
利用消息队列和Nosql数据库两大部件,我们能很快地把分析系统搭起来,利用消息队列作为pipeline,各种业务流程能很快跑通,而且scale-out。
消息队列可以选择kafka、rabbitmq等,Nosql可以选择mongodb、hbase等,具体还要根据实际业务来决定。
一种简单数据流示意如下图所示:
其中直接从消息队列接入数据可以进行类似online的实时分析,比如分类、打tag等。从Nosql接入数据主要进行离线分析,比如聚类(当然可以做成online)、历史数据统计、用户影响力训练/预测等。
这里给出我们一个实际业务的具体数据流,可在此基础上进行各种插拔伸缩。其中消息队里中数据采用pull方式主动获取,db_writer除了入Nosql外,还负责生成全局唯一ID。
部分性能指标
Mongo2.6读写压力测试,单台机器可承受两亿条消息,消息平均10K。
Mongo3.0增加了压缩,存储空间是mongo2.6的20%-40%。
一般分布式消息队列可以把千兆带宽跑满,按消息平均20K计算,每秒可吞吐6000+条。