从Twitter的GitHub账户中可以看到,Twitter已经开源的开源项目有近200个,领域涉及分布式架构、大数据、异步网络传输(客户端、服务端)、Web、工具等。Twitter可以称为构建于开源项目之上,该公司开源负责人Chris Aniszczyk表示,如果没有开源软件,Twitter将不会存在,用户在移动端和PC端发送和接收的每一条推文都会需要开源软件。 Typeahead.js——自动文字补齐jQuery插件这款jQuery插件来自于Twitter的一个新的项目,支持远程和本地的数据集。比较有特色的地方在于你可以将数据集使用本地存储(local storage)来保存在本地,有效的提高用户体验。同时也拥有很多远程数据集的处理选项,例如(请求频率,最大的并发请求数,等等)。 主要特性:
源码地址:https://github.com/twitter/typeahead.js Twemoji——Twitter 的 Emoji 表情TTwemoji 是 Twitter 开源的其完整的 Emoji 表情图片。开发者可以去GitHub下载完整的表情库,并把这些表情加入到自己的应用或网页中。 源码地址:https://github.com/twitter/twemoji Hogan.js——JS模板引擎Hogan.js是Twitter团队所制作的一个针对mustache模板的语法解析器。Hogan.js不依赖其他任何库或框架,同时保证了高效率的模板解析,而其体积却仅有2.5K。用它作为你的一部分资产打包编译模板提前或将它包括在你的浏览器来处理动态模板。 源码地址:http://twitter.github.com/hogan.js Effective Scala——Scala语言Scala是Twitter的主要应用编程语言之一,大部分基础架构是使用Scala编写,有几个大型库包在支持应用,Scala是一种大型高效语言,在实践中要谨慎使用。它的陷阱在哪里,哪个特性我们很喜欢,另外哪些应该注意回避?当在实现“纯函数风格”时,又要注意些什么呢?Scala主要是创建大量形成分布式系统的服务。 Scala提供了需要工具用于简化表达,少打字代表少阅读,少阅读代表能快速阅读,简洁能够增加清晰度(大道至简)。但是简洁也是一种双刃剑,会导致其反面效果,导致阅读者的正确理解度不够。 源码地址:https://github.com/twitter/effectivescala Finagle——RPC框架Finagle 是一个容错的、与协议无关的用于JVM 的RPC系统。Finagle 使用 sbt 进行构建。Finagle 来自 Twitter !它使得在 Java、Scala 或任何基于 JVM 的语言重构建鲁棒的客户端和服务器非常容易。Finagle 支持广泛的基于请求/答复的 RPC 协议和很多类型的流协议 使用 Finagle 可以快速实现异步的远程方法调用 RPC 客户端和服务器端,本身足够灵活支持多种 RPC 变种,包括请求响应式、流和管道模式,如 HTTP 管道和 Redis 管道,也可轻松的有状态的 RPC 一起运行,例如那些需要认证的 RPC 服务。 源码地址:https://github.com/twitter/finagle FlockDB——分布式图形数据库FlockDB将图存储为一个边的集合,每条边用两个代表顶点的64位整数表示。对于一个社会化网络图,这些顶点ID即用户ID,但是对于“收藏”推文这 样的边,其目标顶点(destination id)则是一条推文的ID。每一条边都被一个64位的位置信息标识,用于排序。(Twitter在“关注”类的边上用了时间戳标识,所以你的关注者列表时 按时间排序的,最新的在最前面。) 源码地址:https://github.com/twitter/flockdb Snowflake——分布式自增ID算法Twitter在把存储系统从MySQL迁移到Cassandra的过程中,由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。优点是:高性能,低延迟;独立的应用;按时间有序。缺点是:需要独立的开发和部署。 41位的时间序列(精确到毫秒,41位的长度可以使用69年); 10位的机器标识(10位的长度最多支持部署1024个节点); 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)最高位是符号位,始终为0。 高效很方便的GUID产生算法,一个int64_t字段就可以胜任,不像现在主流128bit的GUID算法,即使无法保证严格的ID序列性,但是对于特定的业务,比如用做游戏服务器端的GUID产生会很方便。另外,在多线程的环境下,序列号使用Atomic可以在代码实现上有效减少锁的密度。 源码地址:https://github.com/twitter/snowflake Diffy——自动化测试工具Diffy是一个开源的自动化测试工具,它能够自动检测基于Apache Thrift或者基于HTTP的服务。使用Diffy,只需要进行简单的配置,之后不需要再编写测试代码。 Diffy主要基于稳定版本和它的副本的输出,对候选版本的输出进行比较,以检查候选版本是否正确。因此,Diffy首先假设候选版本应该和稳定版本有“相似”的输出。即不论候选版本和稳定版本系统模块是否相同,他们的最终输出应该是“相似”的。这里一直使用“相似”,而不是使用相同,是因为相同请求可能会有一些Diffy不需要关心的干扰,比如:
源码地址:https://github.com/twitter/diffy Scalding——Scala库Scalding 是一个 Scala 库简化了 Hadoop MapReduce 作业开发。基于 Cascading 构建。Scalding 跟 Pig 类似,但提供更紧密的 Scala 集成。 Hadoop 是一个统计词(counting words)的分布式系统。 源码地址:https://github.com/twitter/scalding Gizzard——通用数据切分中间件Gizzard是Twitter在2011年4月份新推出的一个通用数据切分中间件,在Twitter的架构中占重要的作用。Twitter还公布了Gizzard的完整代码。有了Gizzard,初创公司和小公司就可以更好更快地处理大量数据,从而利用更少的资源满足用户需求。Gizzard的主要功能如下:
源码地址:https://github.com/twitter/gizzard Summingbird——流处理框架Summingbird是MapReduce流处理框架,一个大规模数据处理系统,支持开发者以批处理模式(基于Hadoop/MapReduce)或流处理模式(基于Storm)或混合模式(即组合前两种模式)以统一的方式执行代码。它基于Apache 2许可发布,用于解决工程师使用现有方法遇到的实际问题:
源码地址:https://github.com/twitter/summingbird Algebird——Scala的抽象代数工具Algebird是用于Scala的抽象代数。这些代码主要是用于建立聚合系统(通过Scalding或Storm)。Algebird跟Summingbird这个组件相关:利用一些概率算法HyperLogLog来提高计算速度。 源码地址:https://github.com/twitter/algebird Iago——网站负载测试工具Iago是一个网站负载测试工具,Iago针对一个给定的网站进行访问录制并合成流量数据。它不同于其他的负载生成工具,它试图保持恒定的请求率。例如,如果你想按每分钟100K来请求你的服务,Iago会试图保持这个速度进行测试。 源码地址:https://github.com/twitter/iagox Heron——数据实时分析平台2016年5月25日,Twitter正式宣布Heron开源。Heron的基本原理和方法:实时流系统是在大规模数据分析的基础上实现系统性的分析。另外,它还需要:每分钟处理数十亿事件的能力、有秒级延迟,和行为可预见;在故障时保证数据的准确性,在达到流量峰值时是弹性的,并且易于调试和在共享的基础设施上实现简单部署。 为了满足这些需求,Twitter讨论出了几种方案,包括:扩展Storm、使用其他的开源系统、开发一个全新的平台。因为有几个需求是要求改变 Storm的核心架构,所以对它进行扩展需要一个很长的开发周期。其他的开源流处理框架并不能完美满足Twitter对于规模、吞吐量和延迟的需求。而且,这些系统也不能兼容Storm API——适应一个新的API需要重写几个topologies和修改高级的abstractions,这会导致一个很长的迁移过程。所以,Twitter决定建立 一个新的系统来满足以上提到需求和兼容Storm API。 在Twitter,Heron作为主要的流媒体系统,运行数以百万计的开发和生产topologies。由于Heron可高效使用资源,在迁移Twitter所有的topologies后,整体硬件减少了3倍,导致Twitter的基础设置效率有了显著的提升。 源码地址:https://github.com/twitter/heron DistributedLog——分布式日志复制服务DistributedLog(DL)是一个高性能的日志复制服务,提供了持久化、复制以及强一致性的功能,这对于构建可靠的分布式系统都是至关重要的,如复制状态机(replicated-state-machines)、通用的发布/订阅系统、分布式数据库以及分布式队列。DL会分类维护记录的序列(sequences of records),并将其称为Log(又叫做Log Stream),将记录写入到DL Log的进程称之为Writer,从Log中读取并处理记录的进程称之为Reader。DL的优势可以总结为:
源码地址:https://github.com/twitter/distributedlog Ambrose——可视化监视系统Ambrose是Twitter发布的开源MapReduce可视化监视系统。 它可以监视Hadoop集群上(目前只限于Apache Pig)的MapReduce任务。Ambrose计划支持:
源码地址:https://github.com/twitter/ambrose SecureHeaders——Web安全开发工具SecureHeaders是Twitter送给Web开发者的一份大礼,作为一款Web安全开发工具,Secureheaders能够自动实施安全相关的header规则,包括内容安全政策(CSP),防止XSS、HSTS等攻击,防止火绵羊(Firesheep)攻击以及XFO点击劫持等。 源码地址:https://github.com/twitter/secureheaders Activerecord-Reputation-System——活动记录信誉系统Activerecord-Reputation-System系统基于Rails开发,可以根据网络中的评价自动对应用程序进行信誉估值,帮助开发者发现更多的应用程序相关信息,从而指导下一步决策。Twitter称,开发者可以很容易地在Rails应用程序中集成该系统,或者从主应用程序中分离该系统,以便做出更好的设计。 该系统是一个信誉网络,网络中的数据根据评价进行更新,然后计算信誉值并通过网络进行传播。在该网络中,直接根据评价计算的信誉值称为原始信誉(primary reputations),间接计算的称为非原始信誉(non-primary reputations)。 源码地址:https://github.com/twitter/activerecord-reputation-system CocoaSPDY——SPDY框架CocoaSPDY是一个面向OS X(Cocoa)和iOS(Cocoa Touch)的SPDY框架,基于他们先前对Netty的贡献,同时,他们更新了其iOS应用程序,使用SPDY代替了纯HTTP。Twitter已经注意到,通信延迟降低了多达30%,当“用户的网络状况变得更糟”时,改善效果更明显。 SPDY有另外一个优点:“多路复用请求”—— 一项在单个TCP会话中连续不断地发送请求并接收乱序响应的能力、从服务器向客户端推送消息,以及压缩请求和响应的头信息。 源码地址:https://github.com/twitter/CocoaSPDY TwUI——UI框架TwUI是一个支持硬件加速的Mac的UI框架:
与UIKit不同的地方:
源码地址:https://github.com/twitter/twui Twemproxy——代理服务器Twemproxy是一个快速的单线程代理程序,支持Memcached ASCII协议和更新的Redis协议。它全部用C写成,使用Apache 2.0 License授权。Twemproxy的强大之处在于可以通过配置的方式让它禁用掉失败的结点,同时还能在一段时间后进行重试,抑或使用指定的键->服务器映射。这意味着在将Redis用作数据存储时,它可以对Redis数据集进行分片(禁用掉结点驱逐);在将Redis用作缓存时,它可以启用结点驱逐以实现简单的高可用性。它的特性是:
源码地址:https://github.com/twitter/twemproxy Fatcache——缓存服务Fatcache可以让你在SSD上运行memcached,你可以把它当作是大数据中的缓存。它的一些性能数据如下:
源码地址:https://github.com/twitter/fatcache AnomalyDetection——自动侦测时间序列异常点的R包AnomalyDetection是一个R语言程序包,Twitter通常会在重大新闻和体育赛事期间用AnomalyDetection扫描入站流量,发现那些使用僵尸账号发送大量垃圾(营销)信息的机器人。 AnomalyDetection异常扫描 据Twitter透露,AnomalyDetection与Twitter去年10月开源的BreakoutDetection存在互补关系。 流量异常侦测对于号称“地球脉搏”的Twitter来说非常具有挑战性,因为对流量进行长周期跨度(例如一年)的扫描分析时,一些异常活动往往会掩 盖掉。此外,流量异常的原因也各有不同,有的是健康的,例如重大新闻事件导致的流量异常,而有的是不好的,例如QPS(每秒查询量)中point-in- time实时性下降可能意味着硬件或数据采集方面出了问题。 长周期流量异常侦测 |