说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

新时代应用程序设计及MongoDB的十个深入理解

HTML文档下载 WORD文档下载 PDF文档下载
区别于从小做起,Serendip从服务发布起就需要处理大量数据,因此他们不得不放弃传统的软件设计方式,转向Scala、Akka、Play、MongoDB、Elasticsearch等新时代技术堆栈。

【编者按】打造一个高扩展性应用程序并不是一件容易的事情,首先要选择合适的技术堆栈,这些技术在具备高扩展性的同时,还需要具备良好的“活力”。不仅如此,你还需要清楚它们的扩展极限,这样才能做出更好的应用程序扩展策略。本次为大家分享两篇博文,其中之一是Serendip前首席架构师Rotem Hermon的Web应用程序设计——架构中囊括了云服务、NoSQL等众多新时代元素。另一个则是10个MongoDB深入理解,出自MongoDB资深解决方案架构师Asya Kamsky。

以下为译文:

Serendip是个社交音乐服务,用作好友间的音乐分享。基于“人以类聚”这个原因,用户有很大的几率在好友那发现自己喜欢的音乐。Serendip基于AWS构建,使用了的堆栈包括Scala(以及一些Java)、Akka(用以处理并发性)、Play框架(用于Web和API前端)、MongoDB以及Elasticsearch。

堆栈的选择

Serendip面临最大的挑战就是刚开始就需要处理大量数据,因为Serendip的一大特性就是从Twitter或者其他音乐服务上收集音乐相关信息。因此,在选择技术堆栈时,首要考虑的问题就是扩展性。

1. JVM

JVM非常适合Serendip的系统特性,同时它的性能也得到许多实践验证,选用它还很大程度上归结于许多开源系统都可以使用本地客户端。

2. Scala、Akka及Play框架

着眼JVM生态系统,Scala这种新式编程语言就非常突出了,同时Scala还可以与Java保持良好的互操作性。之所以选择Scala,Akka这个适合流处理的基础设施框架也占了很大一部分因素。在2011年服务开始构建时,Play web框架才刚变得流行,可靠性也才初见端倪,那时候这些技术都是非常前沿的,不过值得兴奋的是,Scala和Akka在2011年底合并成了Typesafe,而Play也在不久后合并了进来。

3. MongoDB

选择MongoDB的原因许多,比如对开发者友好、易于使用、特征集和可扩展性(使用自动分片)。然而,我们很快就发现,应用程序的数据使用和查询方式需求在MongoDB上建立大量索引,这样一来,系统将很快遭遇性能和内存瓶颈。因此,我们改变了MongoDB的使用策略——继续使用MongoDB作为主要的键值文档存储,同时还利用其原子增量支撑几个需要计数器的功能。

在更换使用策略后,MongoDB表现的非常稳定。同时,MongoDB还有1个易维护的优点,虽然很大一部分原因在于一直避免使用分片和只使用了单一的副本集(MongoDB的分片架构确实非常复杂)。

4. Elasticsearch

为了更好的查询数据,我们需要一个具有搜索能力成熟的系统。在所有可能的开源搜索解决方案中,Elasticsearch是无疑面向云解决方案中最具扩展性的一个。通过动态索引模式及多种搜索和分类的可能性,Elasticsearch让我们看到了支撑很多特性的可能,无疑问的,它成为了系统架构中的一个核心组件。

对于MongoDB和Elasticsearch的维护没有使用托管方案,这主要基于两个原因:首先,希望拥有两个系统的绝对控制,我们不期望将升级或者降级假手于人;其次,需要处理的数据量决定使用EC2将比自己托管贵得多。

系统的统计

Serendip的“pump”每天处理大约500万条信息,即处理来自Twitter、Facebook或其他系统的数据。这些信息经过一系列的“filter”(从其它的服务上抓取并处理音乐链接,比如YouTube、Soundcloud、Bandcamp等),并为这些信息加上元数据。pump和filter在系统中扮演的角色类似Akka,整个过程由一个专门的m1.large EC2实例支撑;因此,它可以按需的进行扩展,并通过Akka的remote actors将负载分配到集群处理。

从这些数据中,系统大约每天可以获得85万条有效信息,这些信息中包含了相关的音乐链接。所有信息都会在Elasticsearch中进行索引,同时MongoDB中也会如此,用于备份和计数。因为每条信息都会修改几个对象,Elasticsearch的速度大约在每秒40个左右。

在Elasticsearch中,信息(tweet和post)的索引按月进行,每个月大约包含2500万条信息,并且拥有3个分片。集群运行了4个节点,每个都建立在m2.2xlarge实例上,还会拥有一个m1.xlarge副本。

Feed的建立

在feed设计时,我们期望它是动态的并且记录了用户行为和输入。如果一个用户将“rock-on”标注到1首歌曲上,或者将“airs”打到某个艺术家上,我们希望这个行为在feed中立刻被反映。如果用户对某个艺术家比较无爱,那么以后将不会给他推荐这首歌。

我们同样希望这个feed整合了多个资源,比如朋友的共享、喜欢艺术家的作品以及那些具有相同品味人们的推荐。这就意味着常用的“fan-out-on-write”方法将并不适合,服务需要一个更实时feed系统的构建方法,充分利用起从用户那收集的信息,而Elasticsearch的一组特性让一切成为可能。

Feed的算法整合了几种策略,它会动态调整不同资源的比率,当然每个策略都会重点考虑用户最近的行为和输入。策略的整合会被转换成实时数据上的不同查询,这些数据会不停的被Elasticsearch索引。鉴于这些数据的实时性以及索引的按月建立,系统只需要查询所有数据中的很小一部分。

幸运的是,Elaticsearch对这样的搜索支撑得非常好。同样它还提供了架构扩展的一个途径——通过增加分片数量,搜索可以通过增加更多的副本和物理节点进行扩展。

“music soulmates”的寻找过程同样是Elasticsearch的充分应用,作为不间断社交流处理的一部分,系统会为社交网络用户计算它所收集中被共享最多的艺术家。

每当Serendip的用户发射一个信号(不管是airing音乐还是与feed交互),都会引起一次“music soulmates”的重计算,算法依赖于喜爱艺术家列表(会被经常修改)重新匹配具有共同口味的用户,当然类似人气、被分享次数这些数据也会被考虑进去。同时,系统还会使用另一套算法来过滤垃圾推送者和异常值。

经过长时间的生产环境测试,我们发现整个系统运行的非常平稳,同时也不需要去考虑附加的系统来运行更加复杂的集群或者推荐算法。

监视和部署

Serendip使用ServerDensity进行监控和提醒,ServerDensity是个付费服务,原生提供了MongoDB和服务器的监视。这个工具在系统内部得到了大量使用,通过自定义指标来显示内部系统的统计。

使用内部统计收集机制收集系统内每个行为的事件,并将它们保存在MongoDB集合中。定时作业每分钟都会从MongoDB中读取这个数据。这样一来,操作数据的同时,ServerDensity还起到了监控Elaticsearch和报警的作用。

服务器和部署的管理依赖于Amazon Elastic Beanstalk,Elastic Beanstalk是AWS定制PaaS解决方案,非常易于开始。虽然它并非完全意义上的PaaS,但是基础功能足以满足一般的用例需求。它提供了简易的自动扩展配置,同时还可以通过EC2来完全访问。

应用程序的建立依赖于EC2上的Jenkins实例,Play网络应用程序被打包成一个WAR,通过post-build脚本将WAR推送给Elastic Beanstalk作为一个新应用程序版本。新版本不会自动地部署给服务器,必须通过手动完成,通常在阶段性的测试后部署到生产环境。

经验总结

下面总结了Serendip打造过程中的几个关键要素:

1. 知道如何进行扩展。可能并不是第一天就需要扩展,但是需要清楚系统中每个部分的组件都可以扩展以及能扩展到什么程度,一定要给自己一定的时间进行扩展。

2. 准备好应对峰值。特别是程序打磨的初期阶段,保留足够的空间以应对突发负载或者进行快速扩展。

3. 选择一门不会拖你后腿的语言。确保语言具备你期望使用技术的本地客户端,或者至少是积极维护的,不要让你的应用程序卡在库的更新上。

4. 相信炒作。你期望的技术必然是长久存在的,一个响亮的,具备活跃社区并且评论不断的技术恰恰证明了它的活力。

5. 不要太相信一些争辩。多查一些该技术的热门评论,它可以让你知道技术的弱点所在。但是也别太在意它们,因为人们在失望时的情绪是非常激动的。

6. 拥有足够的兴趣。选择一门让你兴奋的技术,这才能让你保持充足的动力。


以“ 云计算大数据 推动智慧中国 ”为主题的 第六届中国云计算大会 将于5月20-23日在北京国家会议中心隆重举办。产业观察、技术培训、主题论坛、行业研讨,内容丰富,干货十足。票价优惠,马上 报名

大公网冯咀志:站内搜索系统的PowerLinux迁移实践 2014移动开发者必备的十大应用测试工具 前《连线》主编Chris Anderson:创客就要DIT UC多屏战略 推出电脑版和电视版浏览器 “全国云计算大数据创新项目评选”征集活动正式启动 【走近院士】李伯虎:云制造技术的应用及发展 一周热点: Twitter的下一代分布式数据库Manhattan 专访微软陆奇:大转型中最难的是文化的改变 【CTO俱乐部走进腾讯】问题征集进行中 颠覆移动营销世界的女王Yunha Kim为女性CEO正名 Google揭露“仙女座”虚拟网络,及分散和集中架构之辩 DHTMLX Touch:开源的HTML5和JavaScript框架 Supercell下一城:《海岛奇兵》续写芬兰手游传奇 开发者盛宴 2014 Unity亚洲开发者大会盛大开幕 微软全球中国云业务总经理:云落地中国的最大难题 PTVS 2.1 Beta版发布 Visual Studio的Python工具 【走近院士】李兰娟:云计算与大数据将成为医疗改革利器 迭代不等于学习,聚类分析也不等于机器学习 Office大肆杀戮,已攻下Chrome Web Store Bug都补好了?Google发布Android 4.4.3更新 微软被传收购Xamarin 强势推进移动新战略 挑战传统金融业务 Facebook进军移动支付领域 亚马逊AWS需解决的五项问题 腾讯自曝:大数据平台的秘密 继Cloudera之后,MapR宣布对Spark的完全支持 企业实施商务智能的6个致命错误 《近匠》HBuilder:如何用JS调用几十万原生API? littleBits新推Cloud Module,普通人也能DIY智能硬件 如何创建浮动式标签模式? Office 365正式落地中国——移动为先,云为先 .NET Native:C++的性能 C#的产能? 当用c++编程时,能不能不用回收内存?100分 用VC处理XML文档时遇到的一些细微而重要的问题 大家能不能给我给我点 我有一个关于注册表的问题? delphi中要想定义一个整个工程文件中可以访问的变量怎样做才好?(说者有分) 本人泡MM精华之作,大家快看!! 25分散尽! 如何使用paradox.net? 类的定义与实现细节是否要放在不同文件 各位:我想当斑竹,位兄弟是否同意?:) 关于shell和key事件 为什么我的问题总是无人回答?给高分100!VC和VB下好用的控件在delphi下不好用!是不是dll的问题? pascal 为什么没有介绍在pIIII下汇编的书? paradox数据库的操作问题 text字段如何转换成image字段?? 东日论坛新开张 关于异常的问题,请各位大哥帮帮忙!(50分) 我有很多数字,如何以固定的间隔和行宽在打印机完整地上输出? 学过C++,想学java,难吗?多久能上手? 如何设置系统的日期,时间? 我的网卡的驱动一直装不上? 在下请问,在游戏中实现人物的移动有哪几种方法? 关于地址栏的显示问题 老大们来看看! 今天高兴,散分,先进者自有大大的好处 对不起网管我没看清楚发错了地方请您帮忙转到java区里吧谢谢你了! my oracle8.1.7 on redhat7.2进不去,请高手指教 关于打印机不能够正常打印问题 关于XP的时间问题? 哪位知道在VC下通过敲击键盘模拟钢琴键发音——通过声卡在音箱中实时发出声音 本人泡MM精华之作,大家快看!! 互联网上控件的安全性问题 SDK的疑惑? gluLookAt()函数的用法 什么是类如何来理解应用它!!!看书看了不是很理解 第一次来csdn 高兴,散分,第一个进入者得! 怎样从ACCESS数据库中读出jpeg,gif,bmp...图片? web的验证如何与数据仓库验证一致?请高手看看 我用JBUILDER作的JPUPUPMEUN show(jpane,getx,gety) 的显示位置老在鼠标下一大截,在JPANE的左上角击鼠标右键出现多余显示 请问如何作封面? 国内有自由软件开发组织吗? 如何永久的挂载非linux分区? 高手请进! 在线急等!明天要交任务了! 关于异常的问题,请各位大哥帮帮忙!(50分) VFP报表问题 help!!! 关于listview控件内实现多个选项(图标)拖动的问题? 如何跟改X-WINDOW服务 如何用API实现向另一个程序的窗体里发送信息 关于listview控件内实现多个选项(图标)拖动的问题? 尿素里有减性物质吗 打药时放尿素水有副作用吗 中心原子价层电子数是什么意思RT 硝酸镁 氢氧化钡 氢氧化镁 氢氧化铜 氢氧化铁 氢氧化亚铁 什么颜色的? 碳化铝是不是化学品 得到电子,化合价升高还是降低? 氢氧化铜和氢氧化铁沉淀分别是啥色 查尿素溶化成水喷洒大葱有好处吗 怎样分离氯化铁溶液,氢氧化铁悬浊液,氢氧化铁胶体三者的混合物 氢氧化镁沉淀是什么颜色有没有这种沉淀吗,是白色的吗?如果不是,那么什么金属与氢氧根或者硝酸根结合后会是白色沉淀呢?这是考试的一道题,我填了氢氧化银,不知道可不可以,他是白色的吗 铝呈暗灰色需添加什么化学品 有18克金属铝、完全反应后可制取多少克的氢气27.(5分)节假日里,人们常用色彩斑斓的氢气球点缀喜庆的气氛.填充气球的氢气通常用金属铝和浓氢氧化钠溶液反应制取.(1)某同学对金属铝和浓 金属焊接性能主要取决于金属的什么 尿素有什么作用 氯化铁溶液与氢氧化铁胶体分别是什么颜色? 怎样使一张A4纸变旧变黄根据实际需要,我要改一个文件的其中一页.可是新换上的这一页和其它页之间显得太不一样的,其它的是08年的,比较黄,旧,怎样把新换上的这一页也变旧呢? 什么东西可以把铝变重比如什么东西可以渗金铝里 把铝 变重了 反物质爆炸过吗? 如何让新的白纸快速变成旧的发黄的纸?看起来象是很旧的纸就可以. 什么东西可以让黄金局部变色,变成和铝一样的颜色? 什么是反物质炸弹? 如何在短时间内使纸张发黄变旧 冰醋酸是什么 反物质炸弹要多久研发出来暗物质是未来的能源吗? 怎样才能让新的纸张变旧变黄 如何证实偏铝酸根结合氢离子能力比碳酸根强供选试剂:氢氧化钠溶液 氯化铝溶液 硫酸铜溶液 PH试纸 碳酸氢钠溶液 氯化铁溶液 工业尿素和农业尿素怎么区分,请详细说明下 Na2S溶液与什么反应能生成S沉淀种类越全越好请具体列举,请写出可能的全部物质 二胺和尿素的区别二胺和尿素都是氮肥,但二胺和尿素使用有什么区别,效果有什么不同呢?铵态氮与硝态氮 求用尿素+饲料育肥小尾寒羊的最佳配方?(每月能长多少斤?) NA2S与什么反应生成S,请写出化学式. 尿素和二胺各有什么作用 老柿子树生长,需要多少斤尿素 将5.4g金属铝放入250ml4.0mol/l naoh溶液中,可以收集到氢气体积折算成标准状况是多 买了一个500毫升的塑料喝水瓶子 用了三天了 我发现瓶子一遇到高温的水的话买了一个500毫升的塑料喝水瓶子 用了三天了 我发现瓶子一遇到高温的水的话 瓶子外表就会发出一个怪味道 请问 HCHO和银铵溶液反应式是什么 碳酸根离子和水分子反应生成什么是生成氢氧根离子么?怎么生成氢氧根离子呢 装有水的塑料瓶子为什么烧不坏? 13.5g金属铝与1L 2mol61L-1 NaOH溶液充分反应,生成的气体在标准状况下的体积为多少 将5.4g金属铝放入250ml4.0mol/LNaOH溶液中,若测得反应后溶液的体积仍是250ml,则反应后溶液中NaOH的物质的量浓度是多少? 正常人尿液中的葡萄糖用肥林试剂检测生成砖红色沉淀吗 100ml.1mol•L的氯化铝溶液中加入一定体积2mol.L的NaOH得到3.9克沉淀求加入的NaOH的体积 在新制氯水中加入硝酸溶液,氯水颜色变浅? 嗯,用什么试剂检验葡萄糖 尿素,对植物生长的作用是什么,该如何使用? 给你一颗核弹和反物质炸弹,你会扔到哪里去? 实验室冰醋酸和食用冰醋酸有什么区别, 尿素对植物生长 起到的主要的作用是什么?该怎么使用呢? 将4.5克金属铝放入250mL4.0mol/L氢氧化钠溶液中,并将反应生成的氢气收集,问:能收集到氢气体积(标况)为多少?若测得反应后溶液的体积仍为250mL,则反应后溶液中NaOH的物质的量浓度为多少? 冰醋酸可以食用吗 固体尿素能与水相容并喷撒在农作物的叶面上吗?喷撒花生和玉米 如可以应该怎么配比 氯水 氢氧化铁沉淀 碳酸钠溶液谁能在空气中长时间放置且稳定的? 硝酸铵(NH4NO3)中氮元素的质量分数是多少?多少克硝酸铵中含有70个氮元素?不好意思,打错了==!是70克 离子在方程式中的化合价 比如 银离子 他的化合价是+1吗?得失电子会改变 化合价吗?是不是 H+ 就是+1价 AL3+ 就是+3价? 在方程式中! 向100mL1.0mol/L硫酸铝溶液中加入2.0mol/LNaOH溶液,得到沉淀中所含铝元素 向100ML1MOL/L硫酸铝溶液中加入2.0MOL/LNAOH溶液,得到沉淀中所含铝元素的质量与溶液中铝元素的质量相等,求所加NAOH溶液的体 尿素在水的作用下分解成什么? 为什么得到电子化合价降低 失去电子化合价升高?化合价与电子的关系又是什么 向溴化钠溶液中滴加新制氯水,可以观察到的现象是 有关反应的化学方程式为向碘化钠溶液中滴加溴水,可以观察到的现象是 有关反应的化学方程式为继续加入CCl4振荡,可以观察到的现象是 通 什么化学品可以溶解铝(水溶解)我现在是有一个机器零件,上面有铝、铁、钢,现在是想用什么化学品把铝融化而不伤到铁跟钢 化合价和最外层电子数有什么关系?得失电子和化合价一样吗? “反物质弹”是不是又称“光子弹”?属于核弹又一类型对吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘