从 Twitter 的 GitHub 账户中可以看到,Twitter 已经开源的开源项目有近 200 个,领域涉及分布式架构、大数据、异步网络传输(客户端、服务端)、Web、工具等。Twitter 可以称为构建于开源项目之上,该公司开源负责人 Chris Aniszczyk 表示,如果没有开源软件,Twitter 将不会存在,用户在移动端和 PC 端发送和接收的每一条推文都会需要开源软件。
在 Twitter 公司,当计划开展一个新项目时,工程师会首先衡量需求以及开源项目的能力,并通过定制开源项目来更好地满足需求。正是如此,Twitter 才发展如此迅速,并轻松解决了日益飞速扩增的流量和请求。
Twitter 从开源社区中获得了大量的好处,而 Twitter 也在不断地回馈社区,开源了大量基础设施和工具,使得其他企业和开发者不必重新发明轮子,在这些开源项目的基础上更加快速地实现自己所需。
可以看到,Twitter 在开源社区的贡献是显著的,甚至其贡献的某些开源项目在一定程度上比 Twitter 本身带来的影响力更大。
下面是我整理的 Twitter 现有的比较活跃的开源项目列表,欢迎交流讨论。
jQuery 插件,快速、全功能的自动完成库:Typeahead.js
Typeahead.js 是 Twitter 的一个 jQuery 插件,支持远程和本地的数据集。比较有特色的地方在于,你可以将数据集使用本地存储(local storage)来保存在本地,有效的提高用户体验。同时也拥有很多远程数据集的处理选项,例如请求频率,最大的并发请求数,等等。它的主要特性有:
- 支持数据本地保存,客户端加载,优化加载速度;
- 支持多语言,并且支持阿拉伯文;
- 支持 Hogan.js 模板引擎整合;
- 支持多数据集拼装;
- 支持本地和远程的数据集。
GitHub 主页: https://github.com/twitter/typeahead.js
Star 数量:12700
JavaScript 库:Twemoji
Twemoji 是 Twitter 于 2014 年开源的完整的 Emoji 表情图片,Twemoji 包含 872 个表情,兼容最新的 Unicode 7.0。Emoji,来自日本的小巧符号,通过图像表达感情,已经征服了移动互联网的信息世界。现在,你可以在虚拟世界中随处使用它们。开发者可以去 GitHub 下载完整的表情库,并把这些表情加入到自己的应用或网页中。
GitHub 主页: https://github.com/twitter/twemoji
Star 数量:4899
JavaScript 模板引擎:Hogan.js
Hogan.js 是 Twitter 团队所制作的一个针对 mustache 模板的语法解析器。Hogan.js 不依赖其他任何库或框架,同时保证了高效率的模板解析,而其体积却仅有 2.5K。用它作为你的一部分资产打包编译模板提前或将它包括在你的浏览器来处理动态模板。
GitHub 主页: http://twitter.github.com/hogan.js
Star 数量:4470
Scala 语言:Effective Scala
Scala 是 Twitter 的主要应用编程语言之一,大部分基础架构是使用 Scala 编写,有几个大型库包在支持应用,Scala 是一种大型高效语言,在实践中要谨慎使用。它的陷阱在哪里,哪个特性我们很喜欢,另外哪些应该注意回避?当在实现“纯函数风格”时,又要注意些什么呢?Scala 主要是创建大量形成分布式系统的服务。
Scala 提供了需要工具用于简化表达,少打字代表少阅读,少阅读代表能快速阅读,简洁能够增加清晰度(大道至简)。但是简洁也是一种双刃剑,会导致其反面效果,导致阅读者的正确理解度不够。
GitHub 主页: https://github.com/twitter/effectivescala
Star 数量:1552
RPC 框架:Finagle
Finagle 是一个允许开发者使用 Java、Scala 或其他 JVM 语言来构建异步 RPC 服务器和客户端的库,主要用于 Twitter 的后端服务。Finagle 是 Twitter 基于 Netty 开发的支持容错的、协议无关的 RPC 框架,该框架支撑了 Twitter 的核心服务。
Twitter 面向服务的架构是由一个庞大的 Ruby on Rails 应用转化而来的。为了适应这种架构的变化,需要有一个高性能的、支持容错的、协议无关且异步的 RPC 框架。在面向服务的架构之中,服务会将大多数的时间花费在等待上游服务的响应上,因此使用异步的库能够让服务并发地处理请求,从而充分发挥硬件的潜能。Finagle 构建在 Netty 之上,并不是直接在原生 NIO 之上构建的,这是因为 Netty 已经解决了许多 Twitter 所遇到的问题并提供了干净整洁的 API。
GitHub 主页: https://github.com/twitter/finagle
Star 数量:4690
分布式图形数据库:FlockDB
FlockDB 是一个存储图数据的分布式数据库,图数据库的存储对象是数学概念图论里面的图,而非图片。Twitter 使用它来存储人与人之间的关系图,这些关系包括:你在关注谁,谁在关注你,谁给你留了电话提醒等。FlockDB 可用于支持:
- 高速增 / 删 / 改操作;
- 潜在复杂的集合算法查询;
- 对包含数百万条目的查询结果进行分页;
- 超大规模邻接矩阵查询;
- 将数据进行归档,允许之后被恢复;
- 支持数据水平分割,这样在数据量增加的情况下可以使用更多数据库硬件。
GitHub 主页: https://github.com/twitter/flockdb
Star 数量:2844
分布式自增 ID 算法:Snowflake
Twitter 在把存储系统从 MySQL 迁移到 Cassandra 的过程中,由于 Cassandra 没有顺序 ID 生成机制,于是自己开发了一套全局唯一 ID 生成服务:Snowflake。优点是:高性能,低延迟;独立的应用;按时间有序。缺点是:需要独立的开发和部署。
- 41 位的时间序列(精确到毫秒,41 位的长度可以使用 69 年);
- 10 位的机器标识(10 位的长度最多支持部署 1024 个节点);
- 12 位的计数顺序号(12 位的计数顺序号支持每个节点每毫秒产生 4096 个 ID 序号)最高位是符号位,始终为 0。
Snowflake 是一个很高效很方便的 GUID 产生算法,一个 int64_t 字段就可以胜任,不像现在主流 128bit 的 GUID 算法,即使无法保证严格的 ID 序列性,但是对于特定的业务,比如用做游戏服务器端的 GUID 产生会很方便。另外,在多线程的环境下,序列号使用 Atomic 可以在代码实现上有效减少锁的密度。
GitHub 主页: https://github.com/twitter/snowflake
Star 数量:2546
自动化测试工具:Diffy
Diffy 是一个开源的自动化测试工具,它能够自动检测基于 Apache Thrift 或者基于 HTTP 的服务。使用 Diffy,只需要进行简单的配置,之后不需要再编写测试代码。
Diffy 主要基于稳定版本和它的副本的输出,对候选版本的输出进行比较,以检查候选版本是否正确。因此,Diffy 首先假设候选版本应该和稳定版本有“相似”的输出。即不论候选版本和稳定版本系统模块是否相同,他们的最终输出应该是“相似”的。这里一直使用“相似”,而不是使用相同,是因为相同请求可能会有一些 Diffy 不需要关心的干扰,比如:
- 响应中包含服务器生成的时间戳;
- 代码中使用了随机数;
- 系统服务间有条件竞争。
GitHub 主页: https://github.com/twitter/diffy
Star 数量:2544
Scala 库:Scalding
Scalding 是一个 Scala 库,简化了 Hadoop MapReduce 作业开发,基于 Cascading 构建。Scalding 跟 Pig 类似,但提供更紧密的 Scala 集成。Scalding 是用于 Cascading 的 Scala API。Cascading 是一个构建于 Hadoop 上的 API,用来创建复杂和容错数据处理工作流,它抽象了集群拓扑结构和配置,允许开发者快速开发复杂分布式的应用,而不用考虑背后的 MapReduce。
GitHub 主页: https://github.com/twitter/scalding
Star 数量:2536
通用数据切分中间件:Gizzard
Gizzard 是 Twitter 在 2011 年 4 月份新推出的一个通用数据切分中间件,在 Twitter 的架构中占重要的作用。Twitter 还公布了 Gizzard 的完整代码。有了 Gizzard,初创公司和小公司就可以更好更快地处理大量数据,从而利用更少的资源满足用户需求。Gizzard 的主要功能如下:
- 支持不同的底层数据存储,Redis/Memcache/Mysql 等都支持,原则上只要写操作幂等(也就是写操作与顺序无关)则都可以支持;
- 通用数据拆分支持,支持一致性 hash、主键 mod、自定义拆分函数等多种方式;
- 通过 replication tree 实现不同节点数据的备份机制;
- 容错机制,在一台机器出问题后,会自动保存更新延迟队列,在恢复后重新执行,从而保证一致性;
- 快速迁移。
GitHub 主页: https://github.com/twitter/gizzard
Star 数量:2062
流处理框架:Summingbird
Summingbird 是 MapReduce 流处理框架,一个大规模数据处理系统,支持开发者以批处理模式(基于 Hadoop/MapReduce)或流处理模式(基于 Storm)或混合模式(即组合前两种模式)以统一的方式执行代码。它基于 Apache 2 许可发布,用于解决工程师使用现有方法遇到的实际问题:
- 两个不同系统中的两组聚合逻辑必须保持同步;
- 在每个系统和客户端之间,键和值必须一致地进行序列化;
- 客户端要负责从两个数据存储读取数据、执行最后的聚合并提供合并结果。
GitHub 主页: https://github.com/twitter/summingbird
Star 数量:1736
Scala 的抽象代数工具:Algebird
Algebird 是用于 Scala 的抽象代数。这些代码主要是用于建立聚合系统(通过 Scalding 或 Storm)。Algebird 跟 Summingbird 这个组件相关:利用一些概率算法 HyperLogLog 来提高计算速度。
GitHub 主页: https://github.com/twitter/algebird
Star 数量:1238
网站负载测试工具:Iago
Iago 是一个网站负载测试工具,Iago 针对一个给定的网站进行访问录制并合成流量数据。它不同于其他的负载生成工具,它试图保持恒定的请求率。例如,如果你想按每分钟 100K 来请求你的服务,Iago 会试图保持这个速度进行测试。
GitHub 主页: https://github.com/twitter/iago
Star 数量:1156
数据实时分析平台: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 的基础设置效率有了显著的提升。
GitHub 主页: https://github.com/twitter/heron
Star 数量:1873
分布式日志复制服务:DistributedLog
DistributedLog(DL)是一个高性能的日志复制服务,提供了持久化、复制以及强一致性的功能,这对于构建可靠的分布式系统都是至关重要的,如复制状态机(replicated-state-machines)、通用的发布 / 订阅系统、分布式数据库以及分布式队列。DL 会分类维护记录的序列(sequences of records),并将其称为 Log(又叫做 Log Stream),将记录写入到 DL Log 的进程称之为 Writer,从 Log 中读取并处理记录的进程称之为 Reader。DL 的优势可以总结为:
- 高性能:面对大量的并发日志时,在可持久化的 Writer 上 DL 能够提供毫秒级的延迟,同时还能应对上千客户端每秒大量的读取和写入操作;
- 持久化和一致性:消息会持久化到磁盘上,并且以副本的形式存储多份,从而避免丢失。通过严格的顺序,保证 Writer 和 Reader 之间的一致性;
- 各种工作负载:DL 支持各种负载,包括延迟敏感的在线事务处理(OLTP)应用(如分布式数据库的 WAL 和基于内存的复制状态机)、实时的流提取和计算以及分析处理;
- 多租户:针对实际的工作负载,DL 的设计是 I/O 隔离的,从而支持多租户的大规模日志;
- 分层架构:DL 有一个现代化的分层设计,它将有状态的存储层与无状态的服务提供层进行了分离,能够使存储的扩展独立于 CPU 和内存,因此支持大规模的写入 fan-in 和读取 fan-out。
GitHub 主页: https://github.com/twitter/distributedlog
Star 数量:1846
可视化监视系统:Ambrose
Ambrose 是 Twitter 发布的开源 MapReduce 可视化监视系统。 它可以监视 Hadoop 集群上(目前只限于 Apache Pig)的 MapReduce 任务。Ambrose 计划支持:
- Pig(已实现)
- Cascading
- Scalding
- Cascalog
- Hive
GitHub 主页: https://github.com/twitter/ambrose
Star 数量:1103
Web 安全开发工具:SecureHeaders
SecureHeaders 是 Twitter 送给 Web 开发者的一份大礼,作为一款 Web 安全开发工具,Secureheaders 能够自动实施安全相关的 header 规则,包括内容安全政策(CSP),防止 XSS、HSTS 等攻击,防止火绵羊(Firesheep)攻击以及 XFO 点击劫持等。
GitHub 主页: https://github.com/twitter/secureheaders
Star 数量:1697
活动记录信誉系统:Activerecord-Reputation-System
Activerecord-Reputation-System 系统基于 Rails 开发,可以根据网络中的评价自动对应用程序进行信誉估值,帮助开发者发现更多的应用程序相关信息,从而指导下一步决策。Twitter 称,开发者可以很容易地在 Rails 应用程序中集成该系统,或者从主应用程序中分离该系统,以便做出更好的设计。
该系统是一个信誉网络,网络中的数据根据评价进行更新,然后计算信誉值并通过网络进行传播。在该网络中,直接根据评价计算的信誉值称为原始信誉(primary reputations),间接计算的称为非原始信誉(non-primary reputations)。
GitHub 主页: https://github.com/twitter/activerecord-reputation-system
Star 数量:1301
SPDY 框架:CocoaSPDY
CocoaSPDY 是一个面向 OS X(Cocoa)和 iOS(Cocoa Touch)的 SPDY 框架,基于他们先前对 Netty 的贡献,同时,他们更新了其 iOS 应用程序,使用 SPDY 代替了纯 HTTP。Twitter 已经注意到,通信延迟降低了多达 30%,当“用户的网络状况变得更糟”时,改善效果更明显。
SPDY 有另外一个优点:“多路复用请求”—— 一项在单个 TCP 会话中连续不断地发送请求并接收乱序响应的能力、从服务器向客户端推送消息,以及压缩请求和响应的头信息。
GitHub 主页: https://github.com/twitter/CocoaSPDY
Star 数量:2157
UI 框架:TwUI
TwUI 是一个支持硬件加速的 Mac 的 UI 框架:
- 使用 CoreAnimation 实现的 GPU 加速;
- 简单的 MVC 开发。
与 UIKit 不同的地方:
- 简化 Table View 单元;
- 基于块的布局和 drawRect;
- 一个统一的坐标系统(bottom left origin);
- Sub-pixel 文本绘制。
GitHub 主页: https://github.com/twitter/twui
Star 数量:2725
代理服务器:Twemproxy
Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和更新的 Redis 协议。它全部用 C 写成,使用 Apache 2.0 License 授权。Twemproxy 的强大之处在于可以通过配置的方式让它禁用掉失败的结点,同时还能在一段时间后进行重试,抑或使用指定的键 -> 服务器映射。这意味着在将 Redis 用作数据存储时,它可以对 Redis 数据集进行分片(禁用掉结点驱逐);在将 Redis 用作缓存时,它可以启用结点驱逐以实现简单的高可用性。它的特性是:
- 通过代理的方式减少缓存服务器的连接数;
- 自动在多台缓存服务器间共享数据;
- 通过不同的策略与散列函数支持一致性散列;
- 通过配置的方式禁用失败的结点;
- 运行在多个实例上,客户端可以连接到首个可用的代理服务器;
- 支持请求的流式与批处理,因而能够降低来回的消耗;
- 速度快;
- 轻量级。
GitHub 主页: https://github.com/twitter/twemproxy
Star 数量:5434
缓存服务:Fatcache
Fatcache 可以让你在 SSD 上运行 memcached,你可以把它当作是大数据中的缓存。它的一些性能数据如下:
- 单节点可每秒可处理 10 万 set 操作,每个数据包是 100 字节;
- 单节点可每秒处理 4.5k get 操作,每个数据 100 字节;
- 8 个 Fatcache 实例可处理 32k get 操作 / 每秒到一个单 600GB 的 SSD 存储;
- 你可以通过将多个 SSD 连接到单个机器来提升 IO 性能。
GitHub 主页: https://github.com/twitter/fatcache
Star 数量:1097
自动侦测时间序列异常点的 R 包:AnomalyDetection
AnomalyDetection 是一个 R 语言程序包,主打针对社交网络数据,用途很广,比如系统监测。在 R 里用这两行指令即可安。Twitter 通常会在重大新闻和体育赛事期间用 AnomalyDetection 扫描入站流量,发现那些使用僵尸账号发送大量垃圾(营销)信息的机器人。AnomalyDetection 与 Twitter 之前开源的 BreakoutDetection 存在互补关系。
流量异常侦测对于号称“地球脉搏”的 Twitter 来说非常具有挑战性,因为对流量进行长周期跨度(例如一年)的扫描分析时,一些异常活动往往会掩盖掉。此外,流量异常的原因也各有不同,有的是健康的,例如重大新闻事件导致的流量异常,而有的是不好的,例如 QPS(每秒查询量)中 point-in-time 实时性下降可能意味着硬件或数据采集方面出了问题。
GitHub 主页: https://github.com/twitter/AnomalyDetection
Star 数量:1509
关键数据存储:MySQL
Twitter 于 2012 年开源其自己开发的 MySQL 代码,这可能是当时 Twitter 对开源社区做出的最大贡献。诚然,Twitter 对开源大数据工具的贡献也不小,但 MySQL 的影响显然更大。Twitter 工程师 Jeremy Cole 和 Davi Arnaut 在博客中称: MySQL 是 Twitter 大部分数据(如兴趣图谱、时间轴、用户数据和推文等)的主要存储技术。
MySQL 被全世界数以百万计的 Web 开发者使用,是开源四大天王 LAMP 里的“M”,也是很多 Web 程序的基础。但是 MySQL 也存在一些问题,例如在密集交易时的可扩展性和性能并不理想。这也是 NoSQL 得以产生和流行的原因。对于那些寻求解决 MySQL 扩展性问题的人们来说,能看到 Twitter 在这方面进行的开发工作(源代码)是非常有参考意义的。
GitHub 主页: https://github.com/twitter/mysql
Star 数量:1477
评论