免责声明:我不构建数据库引擎,但搭建Web使用。每一年我约莫跑4-6个分歧项目,所以我搭建了很多Web使用。我阅历过有分歧需求及分歧的数据存储需求的使用。我安排过你传闻过或没传闻过的的大部分数据存储。
我也有几回做出了错误的选择。这是一个关于此中一次的故事——本来我们为何选择它,我们是怎么发明它分歧适,和我们怎么修复的。这一切都发作在一个开放源码的名为Diaspora的项目中。
Diaspora 是一个有着长久汗青的分布式社交收集。早在2010年终,纽约大学四名大先生创立了一个Kickstarter视频,目标是召募10000美元,消耗一个炎天来构建一个替换Facebook的分布式项目。他们将它发送给冤家和家人,并盼望有最好的后果。
但他们触到了把柄。事先正好有另外一起关于Facebook的隐私丑闻,挡季埃落定,回到他们的Kickstarter项目时,他们曾经从6400个分歧的人那边筹集了超越200000美元,而同时这个软件项目,却连一行代码都还没有写出来。
Diaspora是第一个大大逾越其目的的Kickstarter项目。其终局是,他们的项目旧事被登载于纽约时报——但它变成了一个丑闻,由于团队照片的布景黑板上面有一个龌龊的笑话,直到终极印刷都没有人留意到这一点。这可是登载在纽约时报!这个事情的余波实践上是我第一次传闻到这个项目。
他们在Kickstarter上成功的后果,是分开黉舍,离开San FranciscoStart写代码。他们最初在我的办公室任务。那时我在Pivotal试验室任务,他们的一个哥哥也在那任务,所以Pivotal给他们供给了收费的办公空间、收集,固然,装有啤酒的冰箱。我白昼和官方客户任务,下课后和他们一同玩,周末奉献代码。
他们最初在Pivotal待了两年多的时间。固然只是在第一个寒假的开头,他们曾经有了一个最小化的,但曾经可使用(在某种意义上说)的一个分布式社交收集,以Ruby on Rails完成,后端用MongoDB。
这里有非常多盛行辞汇,让我们把它分化来看。
假如你看过《社交收集》,你就晓得了一切你需求晓得的关于Facebook的事。它是个web使用,它在一个单逻辑Server上运转,它可让你与冤家坚持联络。一旦你登录,Diaspora的界面在构造上与Facebook很类似:
Diaspora用户界面的截图
在中间有个信息流,显示你一切冤家发布的信息,在边上有一些其他随机的根本没人存眷过的工具。Diaspora和Facebook首要的技术差别在于对终端用户的不成见性:它是“散布的”部分。
Diaspora的根底设备其实不在一个独自的收集地址上。有几百个自力的DiasporaServer。代码是开源的,所以假如你情愿,你可以树立本人的Server。各个Server,被称作一个pod,有它本人的数据库和本人的用户聚集,并可以与其他具有各自数据库和用户集的Diaspora pod实行交互操作。
分歧范围的Pod相互交换,而没有一其中央关键。
每一个pod经过基于HTTP的API与其它pod通讯。一旦你在一个pod上创立了一个帐号,它实在相当无聊,除非你存眷一些其别人。你可以在你的pod上存眷其他用户,并且你也能够存眷其它pod上的用户。当你存眷的人在另外一个pod上发布一个更新时,将会发作这些工作:
评论按异样的方法运作。在任何单一的发布中,一些评论的评论人可能来自与发布作者类似的pod,而另有一些可能来自其他的pod。任何有权检查这个发布的人将会看到一切的评论,就像你等待的,仿佛每一个人都在一个单一的逻辑Server上一样。
这个架构有技术上和法令上的优势。技术上的首要优势在于容错机制
这是每一个办公室都应当有的一个主要的容错系统。
假如pod中的恣意一个宕机,这不会惹起其他的也宕机。系统的生活,乃至希冀,收集的联系。关于这,有一些风趣的政治上的表示——例如,假如你在一个封闭了外接收集而没法拜访Facebook和Twitter的国度,你的pod照旧会在当地运转,并和你地点国度内的其别人相衔接,即便没法拜访内部。
首要的法令优势是Server的自力性。每一个pod都是一个法令自力的实体,由其创立地点地的法令所掌管。每一个pod也设置本人的服务条目。关于此中的大大多数,你可以在不放弃对内容权限的前提下发布内容,这与Facebook分歧。Diaspora是一个收费的软件,其意义在于“收费”和“自在”,并且大大多数运转pod的人十分在乎这类工作。
所以这就是这个系统的架构。我们再来从一个单一的pod看看这个架构。
每一个pod都是一个Ruby on Rails使用,后端有一个数据库,最后是MongoDB。从某种水平来讲,这个代码库是一个‘典范’的Rails使用——它同时具有一个可视化与可编程的UI,一些Ruby代码,和一个数据库。但在其他方面,它决不是典范的。
一个 Diaspora pod的外部构造
视觉UI明显就是网站用户与Diaspora交互的方法。这个API被各类DiasporaMobile客户端运用——这一部分相当典范——但同时它也被用于"federation"(联邦),这也是描绘pod之间通信的技术名词。(我有一次问过这与罗慕伦人的类似点在那里,后果失掉一堆白眼,擦。)所以说这个系统的分布式特征,给代码库增加了典范使用中所不存在的中间层。
固然,MongoDB是一种数据存储的典范选择。而绝大大多数的Rails使用程序是由PostgreSQL(迩来不常用)或MySQL所支撑。
所以代码部分就是如许。我们再来思索一下我们存储的是甚么样的数据。
(译注:罗慕伦帝国事科幻系列《星际游览》中虚拟的外星帝国,2158年,罗慕伦帝国与事先的地球联邦发作了一场核和平。这场和平同时要挟到了其他的一些种族,并终极促使了星际联邦的树立。2160年罗慕伦人被打败,后与星际联邦签署合约并规定中立区。)
“社交数据”是关于我们冤家、他们冤家和他们活动的收集信息。从观点上来看,我们的确以为它是一个收集——一个以我们为中间,冤家缭绕在我们身旁的无向收集。
一切照片来自rubyfriends.com。感激Matt Rogers、Steve Klabnik、Nell Shamrell、Katrina Owen、Sam Livingston-Grey、Josh Susser、Akshay Khole、Pradyumna Dandwate和Hephzibah Watharkar对#rubyfriends的奉献!
当我们存储社交数据时,我们存储的是阿谁图的拓扑构造,和那些跟着边Mobile的活动信息。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务