BugPhobia进阶篇章:系统架构技术规格
0x01 :开发级需求分析
在开发过程中,团队本身在开发的起始阶段确定了基本的开发级需求分析:
在开发过程中,除了需要满足用户级需求以为,我们还需要针对开发团队的特点,满足一些开发级的需求和约束。作为一个学生团队,我们的开发时间极为有限,很难抽调出大量的时间进行开发。因此,开发效率就显得尤为关键。幸运地是,我们团队本身的学习能力较强,成员对于项目的开发较为积极,且对于新知识上手较快。因此,我们选择大量采用成熟的开源技术来加快我们整体的开发效率,力求以最低的成本实现最多的功能。 |
因此,在开发策略上,团队经过商议后确定了基本方向:
我们简要分析了往届遗留下来的代码,认为其功能较弱且不稳定,相较于目前日益成熟的一些开源技术来说,各方面都相去甚远。因此,我们经过细致的讨论后决定大胆地扔掉遗留代码,采用新技术重新实现。一则可以规避原有代码本身遗留下来的诸多问题,二则采用新技术可以快速地实现更多功能,三则可以使团队成员学到一些当下流行的技术,对成员将来的发展也会有所裨益。 |
综上所述,我们团队将尽可能地在开发中采用成熟的开源框架和开源技术,以实现我们对于开发效率和开发质量的需求。
0x02 :架构设计
0x0200 :设计摘要说明
首先从架构的层次上,对本身的设计进行最简短的概述:
前端页面 |
直接与用户打交道,与用户进行交互 |
后端系统 |
负责处理用户的请求,并衔接搜索系统,为用户提供其想要的数据 |
搜索系统 |
负责搜集、整合数据,并响应网站后端的搜索请求,提供搜索结果 |
因此,不妨设计学霸在线系统的概念架构图如下图所示。
ü 搜索系统和后端系统为两个不同的执行体,二者通过HTTP协议进行交互,实现搜索系统与后端系统的解耦,使得我们可以轻松地扩展搜索系统本身,而不会对后端造成太大的影响。
ü 前端页面适当地运用ajax技术和后端进行交互,在减少服务器刷新压力的同时,也可以在一定程度上使前后端分离。
0x0204 :前端页面设计
我们团队的主要任务是大幅改善原有UI,实现一个优质的前端交互效果。为了达到这一目标,我们经过细致地调研,最终选用了Semantic UI前端框架。该框架具有时下流行的响应式布局特性。且该框架主打UI效果,很多组件都自带了动画效果,整体主题风格前卫,能体现出现代网页设计的特点,符合当代的审美观点。 Semantic UI最主要的特征是采用语义化开发。这套框架中的class都被命名为了描述其对应功能的形容词或者名词。这样的设计使得我们得以快速上手,对于我们提高开发效率大有帮助。使用该框架可以快速开发出现代化的高质量的前端页面,从而保证我们团队能够高质量地完成我们的任务。 |
0x0208 :后端系统设计
为了达到我们的开发级需求——快速开发,我们选择使用Python作为后端开发语言,并采用了Django这一重量级的后端框架来实现我们的后端。 Python的开发效率素来为人所称道。且我们团队中的大部分成员对于Python都有一定程度的了解,使用Python学习成本低,且开发效率高。因此,我们认为后端采用Python进行开发是一个相当正确的选择。 为了快速地实现我们的后端,我们采用了Django框架。Django框架经过开源社区多年来的努力,已经成为Python后端开发的不二之选。对于常见的Web开发需求,Django都提供了相应的模块。特别是几乎每个网站都必备的用户系统,Django中更是提供了相当多的支持,使得我们可以在短时间内实现我们的设计。除了其本身的功能外,Django具有大量的优质文档,以及成熟的开源社区。遇到问题时,我们有很多途径可以查找到相应的解决方案。Django的上述优势,使我们最终做出了采用它来实现我们的后端系统的决定。 后端系统主要有两部分功能,一部分是与用户系统相关的功能,如用户的登陆、管理、活动等等,另一部分则是与搜索引擎的衔接。同时还有一个模块负责整个站点的衔接、整合等。 |
0x0204 :搜索系统设计摘要
我们待搜索的内容一个有两类,一类是问答数据,一类是课程资源。这两类资源在系统中的处理是不同的,因此,在搜索系统设计的时候,我们就选择将这两类数据源直接分开。 对于课程资源的搜索类似于传统的页面爬取,我们采用分布式的nutch进行爬取,提高爬取能力的同时,减轻团队在爬取方面的工作量。同时,使用solr作为搜索引擎后端进行搜索,其对于海量数据的处理能力较强,可以实现较好的搜索效果。 对于问答资源,我们采用另外一种方案:StackExchange API可以直接返回Json格式编码好的相关信息。该API可以返回Tags、Posts、Answers、Questions等一系列信息。我们通过一个类似爬虫的程序在后台请求相关API,将数据直接整理入库,从而实现对于问答资源的整合。 |
0x03 :平台架构设计
0x0300 :HTTP Server
我们选用的Web服务器是Apache HTTP Server。Apache HTTP服务器是一个模块化的服务器,源于NCSAhttpd服务器,经过多次修改,成为世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。 |
0x0304 :搜索引擎
对于搜索业务,我们选用了搭建在Apache服务器上的Solr + Nutch的配置。Solr和Nutch均为Apache项目中的搜索引擎项目,而二者所擅长的方向不同。
Nutch |
与类似于Apache Droids 这样的抓取框架相比,Nutch提供了我们很多很好的优势。其中,显而易见的一点是Nutch 提供了可以让你完整的实现搜索应用的特性集,其次是Nutch 的高可伸缩性(scalablity)和健壮性(robust),Nutch 运行在Hadoop 上,你可以运行在单态机器上,也可以运行在一个100台机器构成的集群(cluster)上,另外,Nutch 有很高的抓取质量,你可以配置哪些页面更重要,优先抓取,拥有丰富的APIs可以让你容易的集成Nutch 到你的应用中(可扩展性),更重要的一点是,Nutch 的内建组件,超链数据库(LinkDatabase),拥有该组件,可以大幅的提高搜索结果的关联度,Nutch 在被抓取的页面之间跟踪超链接,以便依靠內部链接来判断页面和页面之间的相关度。 |
Solr |
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。Solr是基于Lucene的全文搜索服务器,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。 |
BugPhobia进阶篇章:系统架构技术规格的更多相关文章
- BugPhobia进阶篇章:前端技术/设计文档
0x01 :前端概述 0x0100 :前端基本描述 前端基础框架 Semantic UI 根据http://semantic-ui.com/提供的样例和文档,依据Version 2.1.4版本的特性进 ...
- BugPhobia进阶篇章:功能规格说明书
0x01 :特别鸣谢 首先特别鸣谢<构建之法>中并没有给出固定化格式的功能规格说明书的样例,因此在此次的说明书中将尽可能用生动形象的例子展示软件交互阐释 因此受到它本身的启发,此次团队功能 ...
- 百度架构师带你进阶高级JAVA架构,让你快速从代码开发者成长为系统架构者
百度架构师带你进阶高级JAVA架构,让你快速从代码开发者成长为系统架构者 1.
- 【Java进阶面试系列之一】哥们,你们的系统架构中为什么要引入消息中间件?
转: [Java进阶面试系列之一]哥们,你们的系统架构中为什么要引入消息中间件? **这篇文章开始,我们把消息中间件这块高频的面试题给大家说一下,也会涵盖一些MQ中间件常见的技术问题. 这里大家可以关 ...
- Android进阶(十一)Android系统架构讲解
如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...
- Android进阶加密-第1章-Android系统架构-读书笔记
第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...
- BugPhobia准备篇章:团队Beta阶段准备工作分析
0x00:序言 To the searching tags, you may well fall in love withhttp://xueba.nlsde.buaa.edu.cn/ 再见,无忧时光 ...
- BugPhobia开发篇章:Alaph阶段Scurm Meeting
[github] https://github.com/bugphobia/XuebaOnline 0x01 :目录与摘要 If you weeped for the missing sunset ...
- 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)
课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...
随机推荐
- java返回值是list的时候获取list的参数类型
Type[] resultArgType = null; Type resultType = method.getGenericReturnType(); if (resultType instanc ...
- redis面试必问
1.项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试题剖析 为什么要用缓存? 用缓存,主要有两个用途:高性能.高并发. 高性能 假设这么个场景,你有个操作,一个请求过来,吭哧 ...
- NSIS学习记录の----查找注册表某个键是否存在
最近要做一个注册表的判断.以往都是注册表某个键的键值存在查找,但是如何判断一个空键值的键是否存在呢(很多大厂装逼不写键值,有默认就好)? 下面给出解决办法(要沟通请邮件联系:7-7-2-7-0-6-5 ...
- python五十八课——正则表达式(替换)
替换:sub(regex,repl,string,count,[flags=0]): 替换数据,返回字符串(已经被替换完成后的内容)subn(regex,repl,string,count,[flag ...
- sahrepoint 上传到文档库
sharepoint学习笔记汇总 http://blog.csdn.net/qq873113580/article/details/20390149 /// <summary&g ...
- 函数中声明变量不用Var的情况
我们都知道函数中声明变量不用Var时这个变量会成为全局变量,但是并不是函数一开始执行就会把它变为全局变量,必须执行到这条语句. 看一段代码 function f(){ alert(a); ...
- day12 Python列表
list#类 列表概括 li = [1,2,13,["石振文",["19", 10],"庞麦郎"],"charon",& ...
- Rman将数据文件恢复到不同的路径
RMAN> startup nomount connected to target database (not started)Oracle instance started Total Sys ...
- Redis漏洞,远程攻击
文章转自http://blog.csdn.net/whs_321/article/details/51734602 http://blog.knownsec.com/2015/11/analysis- ...
- Java不定参数Object… obj 和 Object[] 的区别
Java不定参数Object… obj 和 Object[] 的区别 简述: java中方法重载可以实现参数不同自动匹配对应方法.但现实中也存在这种问题.普通传参对于形如下面的方法,却显得臃肿而失优雅 ...