`
steven19880224
  • 浏览: 12105 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Trello架构分享

 
阅读更多

Trello架构学习

1.Trello简介

Trello是由著名的软件工程师 Joel Spolsky开发的一个团队协作平台,在TechCrunch Disrupt大会上正式发布。在不到3小时的时间内,Trello已经积累了5000多用户。 Trello上的工作都围绕“木板(board)”进行,同一小组的用户可以在这里创建待办事项列表(to do list)、创建任务,并分配给同事,当同事完成工作后可以把任务状态标记为完成,类似于producteev。你可以为每个项目创建一张卡片,里面包括活动、附件、更新、沟通内容等信息。你可以把同事拖拽到这些卡片中,然后把卡片拖到列表里。 和其他的项目管理系统都是以开发者为中心的,过于复杂,对普通用户缺乏吸引力。Trello则为各种流程设计,既可以当做公司的协作工具,也可以当做个人的列表管理工具。

2.CoffeeScript

CoffeeScript (GitHub repo) 是一个使用纯Ruby编写的新编程语言,创建者 Jeremy Ashkenas戏称它是- JavaScript的不那么铺张(买弄)的小兄弟。因为CoffeeScript会将Ruby编译成JavaScript,而且大部分结构都相似,但不同的是,CoffeeScript拥有更严格的语法。

官方主页:http://coffeescript.org/

3.client

Trello的服务器上实际上没有运行html代码。Trello的客户端是单个的经过精简和压缩的js文件(2k)(包括第三方库和编译过的CoffeeScript以及Mustache模板,压缩过的css代码和内联图片)。所有的这些都在250k以下。而且通过Amazon cloudfront内容分发网络提供的服务,所以在大多数地方都能提供低延迟的服务。在高带宽的情况下半秒内就能在浏览器中加载client。与此同时,放弃了使用ajax获取加载页的数据文本,运用websocket予以代替。

3.1Backbone.js

主要提供了3个东西:1、models(模型) 2、collections(集合) 3、views(视图)
       Backbone.js文件本身很小,压缩后只有5.3KB,作为一个框架级别的核心JS文件,这个数字很可怕。除此之外,这个JS还必须依赖于另一个JS文件:underscore.js(包含许多工具方法,集合操作,js模板等等)。
用Backbone.Model表示应用中所有数据,models中的数据可以创建、校验、销毁和保存到服务端。当models中值被改变时自动触发一个"change"事件、所有用于展示models数据的views都会侦听到这个事件,然后进行重新渲染。
Backbone.Collection和我们平时接触的JAVA集合类相似,具有增加元素,删除元素,获取长度,排序,比较等一系列工具方法,说白了就是一个保存models的集合类。

Backbone使用views渲染那些从服务器下载下来的Models,然后提供了如下简易的方法。

1)通过views生成的html查看DOM事件,并且将这些事件与Models建立相关,这些模型会和服务器端重新同步

2)观察Models的变化,重新渲染Models的html块,以此来展示Models的变化。通过自己开发的客户端Models缓 存处理模型的更新和Models的重用。

官方主页:http://documentcloud.github.com/backbone/

3.2 Html5 pushState

         页面加载完成后,不希望在页面间的切换上花费任何时间。因此运用了html5 pushState在页面间移动。这样就能给与地址栏适当的和一致的链接。要做的仅仅是将载入数据并且交付给适当的Backbone controller处理。

3.3 MUSTACHE

       运用了mustache模板(一个逻辑很少的模板语言)来代替显示model的html。mustache使我们能够不用将将客户端逻辑代码与模板代码混合的情况下复用模板代码。  

4.pushing and polling(推送和轮询)

       实时更新不是一个新的话题,但是对于一个协同工具是相当重要的。

4.1 socket.io and websocket

       客户端和服务端之间建立websocket链接,这样子服务端就能实时推送给在特定通道监听的浏览器。运用socket.io和服务端库,在占用cpu资源很少的情况下,同时维持好几千个websocket链接。

4.2 ajax polling 

       当客户断不支持websocket时,当一个用户活跃时,每几秒进行少量的ajax请求更新;当一个用户空闲时,每10秒进行轮询。由于我们的服务器配置,能够在使用很小开销的情况下,提供https请求并且保持TCP链接打开。

                                                                   

                                                                                              图1 原先的客户端架构                                                          

       但是其间遇到了一个问题,在调整轮询活跃和空闲用户状态间隔后,解决了出现的怪异的问题。

 

5. server

5.1 node.js

        trello服务端主要用node.js实现。trello需要的是即时更新,这就意味着要保持许多链接处于打开状态,因此消息驱动和非阻塞是一个好的选择。node.js也是一个让人惊讶的单页面app开发的原型工具。原型版的trello服务端仅仅是一个函数库。用来操作node.js单个进程的内存的Models队列。客户端仅仅是通过轻量级的websocket的封装调用这些函数。

       我们增加了如下,是系统更为完善:

       1)一个真实的DB和Schema(node-mongodb-natice and mongoose

       2)web基础技术,routes和cookies(ExpressConnect

       3)多个服务器进程和零停机重启(cluster

       4)进程间切换和数据共享通过使用Redis(node_Redis

       使用了一个异步库async library,CoffeeScript,使我们的代码简洁并在可控制的范围内。

5.2 HAPROXY

       用haproxy做为服务器间的负载均衡。

5.3 Redis

       trello使用redis在服务器进程间共享生命周期较短的数据,这些数据不会持久化到磁盘。例如,session的活跃水平;临时地OpenID键。如果redis存储的这些数据全部或者部分丢失,那么应用程序能够自动恢复。我们在allkeys-lru配置下运行redis并且设置了比实际需要多5倍的空间。redis自动撤销在不久的将来没有被使用的数据,并且在需要时创建他们。

      我们最有意思的应用是短轮询回调为了发送变化的数据到models下载到浏览器端。当一个server端的对象改变,我们发送一个josn消息,通过合适的websocket通知所有客户端浏览器,并且为受影响的model也存储该消息在一个固定长度的list,并且注意有多少消息存储在该list。这样,当一个clinet通过ajax轮询是否在服务端有对象改变时,在多数情况下我们能够得到整个服务器的响应在权限检查和检查单redis的值。Redis能够在一秒内做上千次这样的检查,所以它不会大幅削弱单个cpu的计算能力。

       redis也是我们的发布和订阅服务器。我们用它发布对象的更改消息,来自服务器进程启动向其他服务器进程的请求。一旦你有一个redis服务器,你会开始在各种情况下使用他。

 

5.4 MongoDB

       MongoDB弥补了许多我们对于传统数据库的需求。我们想让trello变得很快。我们所知道的最酷的,对于性能很着迷的团队就在我们隔壁StackExchange。在和他们的开发主管聊天时,了解到,即使用了sql-server作为数据存储,他们还是运用了很多反规格化的数据,为了获取更高的性能。

       为了高速的读、写,我们放弃了关系型数据库的特征。并且有了反规格化的支持,我们能够在一个文档中存储一个card的数据,同时也能检索文档的子域和建立索引。

        在用户增长很快的情况下有一个能够在读写方面合理的滥用,是一件很庆幸的事情。MongoDB能够很容易的进行复制、备份和恢复。

        使用MongoDB松散文档存储的另一个好处是在同一个数据库下,运行不同版本的Trello,无须进行数据迁移。

 

文章翻译自:http://blog.fogcreek.com/the-trello-tech-stack/

 

中间有些省略了。可以和原文对照着看。

分享到:
评论
2 楼 steven19880224 2012-06-06  
shinichi 写道
英语好牛逼啊。老陈怎么就没有发现你的英语如此之好呢。

这个不能让他发现的,被发现了我就惨了。
1 楼 shinichi 2012-06-06  
英语好牛逼啊。老陈怎么就没有发现你的英语如此之好呢。

相关推荐

    高级架构师九阶段

    - **实战经验积累**:参与开源项目贡献代码、撰写技术文章分享心得等途径增加实战经验。 - **技能拓展**:根据自身兴趣和职业规划选择性地学习新兴技术(如区块链、人工智能等),拓宽知识面。 通过上述九个阶段的...

    2017全球架构师峰会深圳站ppt-cut4

    总的来说,这场2017年深圳站的全球架构师峰会提供了丰富的知识和经验分享,涵盖了技术创业的策略、提升工程效率的方法,以及移动端架构的最佳实践。这些内容对于任何想要在IT行业中取得成功的人来说都是宝贵的资源,...

    PyPI 官网下载 | aiotrello-0.0.7.7-py3-none-any.whl

    PyPI是Python开发者发布自己软件包的官方平台,用户可以通过它来查找、安装和分享各种Python模块和工具。 描述中提到的资源"解压后可用"暗示这是一个已经打包好的Python轮子文件(.whl),这是一种预编译的Python二...

    stackoverflow网站剖析

    Stack Overflow作为全球最大的程序员问答社区,其技术架构、硬件配置以及部署方式对于IT界的专业人士来说一直是学习和借鉴的典范。从2016年开始,Stack Overflow的工程师Nick Craver开始撰写了一系列关于Stack ...

    某项目的一些总结

    2. **设计模式与架构**:项目可能采用了特定的设计模式或架构,如MVC(模型-视图-控制器)、微服务架构,或者是事件驱动或面向服务的架构。博主可能分享了这些模式在实际项目中的应用及优缺点。 3. **编程语言**:...

    kk design

    "kk design"作为一个专注于软件设计的主题,它不仅关注于理论知识的分享,同样注重于实践中的工具运用和技巧的传授。本文将围绕软件设计的核心内容,深入探讨设计模式、架构设计、UI设计以及设计过程中不可或缺的...

    敏捷软甲开发设计 敏捷软甲开发设计 敏捷软甲开发设计

    敏捷开发中常用的一些工具包括Jira、Trello、Confluence、Git等,它们用于项目管理、版本控制、协作和文档共享。 总结来说,敏捷软件开发设计强调灵活性、沟通和迭代改进,旨在创建满足客户需求的高质量软件。通过...

    项目资料 一个小小的案例

    在这个名为"项目资料 一个小小的案例"的压缩包中,我们可以推测它包含了一个小型的项目实例,可能是为了教学、演示或分享目的。尽管描述部分似乎没有提供具体的信息,但我们可以从标签"案例"中推断,这可能是一个...

    软件工程课件-好东西一起分享

    概要设计确定软件的整体架构和模块划分;详细设计则细化到每个模块的具体实现,如数据结构和算法的选择。 4. **编码**: 编码是将设计转化为实际可执行程序的过程,遵循编程规范和最佳实践,确保代码的质量和...

    我的八股文准备经验分享

    ### 我的八股文准备经验分享 #### 一、前言 在当前的技术面试环境中,“八股文”已经成为一种非常重要的准备手段。虽然这个词听起来有些负面,但实际上它指的是通过系统化的方式准备常见技术问题的答案,以便在...

    软件开发的经验建议15篇

    了解敏捷开发方法,如Scrum或Kanban,以及如何使用工具如Jira或Trello来辅助管理,都是至关重要的。 2. **编程技巧**:提高编程效率和代码质量是每个开发者永恒的话题。可能会探讨如何编写可读性强、可维护性高的...

    计算机课程设计详细讲解教程分享

    系统设计阶段,你需要构建软件架构,设计模块划分,确定数据结构和算法。合理的设计能提高代码的可读性和可维护性,降低后期修改的成本。 五、编程实现 使用合适的编程语言(如C++、Java、Python等)进行编码。遵循...

    blog.rar_project

    这个项目可能涉及到软件开发的多个方面,包括但不限于编程语言、数据库管理、前端设计、后端架构等。 描述中的"software engineer project"进一步确认了这是一个软件工程师进行的项目,这通常涵盖了软件开发的全...

    电赛之路:历年试题剖析、实战经验分享与代码资源宝典

    - **沟通工具**:使用Git进行代码版本控制,Trello或钉钉进行任务分配和进度追踪。 2. **时间管理与迭代开发** - **里程碑规划**:将项目分为若干个里程碑,每个阶段设定具体目标。 - **敏捷开发**:采用敏捷开发...

    fogdingding-Note:分享自己在撰写专案过程中,来设计,解决,查询处理问题的过程分享。希望这些对于其他人也有用处

    3. **架构设计**:笔记可能包含了关于如何构建软件架构的信息,如MVC(模型-视图-控制器)、微服务架构、事件驱动架构等,以及如何根据项目规模和复杂性选择合适的架构。 4. **编程语言和框架**:笔记可能涉及作者...

    计算机软件工程相关论文

    这篇论文集涵盖了软件工程的多个重要领域,旨在分享和探讨最新的研究进展和实践经验。 1. 需求工程:在软件工程中,需求分析是项目启动的关键步骤。它涉及识别用户的需求并将其转化为明确的规格说明。论文可能讨论...

    百度文库.zip

    在软件开发方面,文档可能包含敏捷开发方法(如Scrum、Kanban)、版本控制(如Git)、项目管理工具(如Jira、Trello)的使用指南,以及代码调试和测试策略。 网络技术相关的文档可能讲解TCP/IP协议、网络安全、路由...

    办公自动化(办公软件)测试版

    5. **项目管理**:如Trello或Asana,帮助规划任务、跟踪进度和分配资源。 6. **流程审批**:自动化工作流,如合同审批、报销申请等,可以减少人为错误,提高效率。 7. **知识管理**:存储和分享企业内部知识,如...

    msbb110830

    不过,我可以分享一些通用的IT知识。例如,"zip"是一种常见的文件压缩格式,用于减少文件大小以便于存储和传输。在Windows系统中,你可以使用内置的压缩工具来创建和解压.zip文件。在编程领域,MSBB可能是指某个软件...

Global site tag (gtag.js) - Google Analytics