一淘网offline系统简介
Offline系统简介
导购搜索(一淘网)系统类似一个购物垂直搜索引擎,收录和购物相关的各种信息,并以各种不同数据来源为单位呈现给终端用户,供其做购物决定时参考。
Offline系统是连接数据源和存储的中间环节,接收从各种数据源过来的数据,经过加工后存储到存储系统中。更详细的一淘网技术简介请参考 一淘网技术简介
Offline系统考虑的要求
1. 能灵活接收各种数据源
Offline的数据源大致可以分为两种
a. 无固定格式的数据,也就是导购搜索的crawler系统从互联网中获取的导购相关的数据
b. 有固定格式的数据,也就是淘宝内部的数据或者是从合作方拿到的数据。
导购系统是根据页面的类型来组织数据的,所以不管是有固定格式的数据还是无固定格式的数据,都会根据其类型来进行组织。所以这就要求offline系统能够灵活的接收各种数据源。
为了能方便的接纳多个数据源提供的数据,有必要把offline处理的数据统一为一个通用的数据结构,这样就避免了为每个数据源开发不同接收程序的繁琐。如何设计这个通用数据结构,请接着往下看。
2. 给所有offline处理模块提供一个统一的接口
Offline系统需要容纳多个处理模块,比如分类、内容抽取、链接抽取、打指纹等等。每个处理模块都需要不同的输入以及产生不同的输出。如果为每个模块都设计不同接口,那么作为容纳各个模块的offline系统框架来讲,集成工作将会变得十分复杂,并且很难灵活的增加新的处理模块。
于是,offline系统框架中引入了一个通用的存储结构,把各个模块需要的输入以及输出字段都放在这个统一的数据结构中,每个模块各取所需就好了。由于把各个模块的输入和输出都统一在一个大的数据结构中,每个模块的操作就很容易抽象成统一的接口了。简单讲,每个模块会进行3个操作初始化,处理数据,以及反初始化。已经足够简单了是吧。
所有模块需要的输入以及输出信息都统一在一个数据结构中,这个数据结构会变得十分复杂,不光是存储数据(比如原始页面,分类结果,抽取结果等),还有一些控制逻辑(比如合作站点的数据不需要进行抽取等),编写这样的数据结构将是一个噩梦,并且由于会加入新的处理模块以及各个模块的输入输出会有时调整,维护这个数据结构将是一个费时费力的体力活。
还好我们可以借助一些开源的工程简化我们的工作,让工程师的生活更美好一些。这个数据结构我们使用了google 的 protocol buffer,只需要进行简单的数据格式描述,就可以生成这个复杂庞大的数据结构了。protocal buffer的介绍除了参考官方文档,也可以参考 Protocol Buffers的应用与分析
3. 能够方便的容纳新的处理模块,并允许这些模块方便的调整顺利
由于offline的各个模块采用统一的接口以及通用数据结构,增加新的模块就变得非常简单了。只需要实现这个接口就可以增加新的模块了。Offline的数据接收以及数据处理模块采用配置文件的方式进行配置,增加新的处理模块,以及调整模块间的顺序,只需要更改配置文件就好了,不用改动offline的系统框架。这也给升级系统带来了一些方便。
4. 最大化处理能力,并根据接收数据的容量调整处理能力
Offline系统可以接入多种数据源。由于这种数据源的数据获取可能有波动,以及输出数据时也会产生波动,offline系统框架设置了两个队列,一个输入队列、一个输出队列。这样IO线程将只和这两个队列打交道,负责从数据源获取数据,并把输入队列中的结果输出到存储系统中。工作线程负责从输入队列获取数据,处理完成后存放到输出队列中。这样,对于CPU密集操作的工作线程来讲,只需要和内存中的两个队列进行交换,能够最大化处理能力。
采用上面的输入输出队列作为缓冲,就可以方便调节数据接收以及数据处理能力 的关系了,分别设置IO线程以及工作线程的数量,就可以方便的配比这两种不同工作的负载。通常来讲,IO线程只需要一个就好了,工作线程根据数据处理量进行设置就好了。
Offline系统设计
上面提到了对Offline系统框架的要求,满足上面提到的要求,offline系统的基本框架如下图
这个系统架构图,基本上体现了对上面提到的offline系统设计要求的考虑。再简单描述一下,offline系统中有一个IO线程,负责接收多个数据源的数据,并把接收到的数据放到输入队列中,在轮询完所有输入数据源后,把输出队列的结果输出到存储系统中。
工作线程从输入队列获取一条数据,处理完成后,存放到输出队列中即可。
导购系统的offline部分的设计思路讲完了,欢迎大家拍砖交流。
建议继续学习:
- 无锁消息队列 (阅读:12780)
- 多线程队列的算法优化 (阅读:6498)
- TSQ 的原理 (阅读:5932)
- 各消息队列软件产品大比拼 (阅读:5136)
- Gearman Server 使用 MySQL UDFs 来管理和保持队列 (阅读:4856)
- 一些队列理论 吞吐量、延迟和带宽 (阅读:3253)
- 无锁消息队列 (阅读:3196)
- 实现多线程对队列的读写操作(封装类) (阅读:3047)
- RabbitMQ与Redis队列对比 (阅读:2940)
- Feed消息队列架构分析 (阅读:2581)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:lehou 来源: 搜索技术博客-淘宝
- 标签: offline 队列
- 发布时间:2011-01-18 22:16:37
- [67] Go Reflect 性能
- [67] Oracle MTS模式下 进程地址与会话信
- [67] 如何拿下简短的域名
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [60] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [47] 界面设计速成