1

一淘网offline系统简介

 2 years ago
source link: https://blogread.cn/it/article/3033?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一淘网offline系统简介

浏览:1956次  出处信息

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

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK