技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> 一淘网offline系统简介

一淘网offline系统简介

浏览:2255次  出处信息

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部分的设计思路讲完了,欢迎大家拍砖交流。

建议继续学习:

  1. 无锁消息队列    (阅读:12835)
  2. 多线程队列的算法优化    (阅读:6526)
  3. TSQ 的原理    (阅读:5959)
  4. 各消息队列软件产品大比拼    (阅读:5164)
  5. Gearman Server 使用 MySQL UDFs 来管理和保持队列    (阅读:4868)
  6. 一些队列理论 吞吐量、延迟和带宽    (阅读:3263)
  7. 无锁消息队列    (阅读:3205)
  8. 实现多线程对队列的读写操作(封装类)    (阅读:3072)
  9. RabbitMQ与Redis队列对比    (阅读:2977)
  10. Feed消息队列架构分析    (阅读:2633)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1