免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

LinkedIn 开源软件项目数量已经超过了 100 个

  • 2016-08-07
  • 本文字数:2320 字

    阅读完需:约 8 分钟

社交网络巨头、开源社区的活跃贡献者 LinkedIn 最近又开源了一系列重量级基础设施软件。到目前为止,LinkedIn 在 GitHub 上开源的软件项目数量已经超过了 100 个。

最近宣布开源的项目有 URL-Detector Rocket Data LayoutKit 等。

URL-Detector

URL-Detector 是一个以文本方式检测和标准化 URL 的 Java 库。为了保证用户的安全使用,所有用户提交的内容都会经过安全检测。LinkeIn 的内容验证服务每秒钟都要处理几十万个 URL,检查其中是否有恶意软件或钓鱼软件。LinkdedIn 的高级软件工程师 Tzu-Han Jan

如果提交的内容是一个 URL,我们就直接用我们的内容验证服务去检查。如果提交上来的是一大堆文本,那就先用 URL-Dector 算法把可能的 URL 从中提取出来,再把 URL 交给内容验证服务。

他们设计了一个有限状态自动机来从文本中提取 URL。有限状态自动机是一个包含了若干状态的系统,每个状态可能根据不同的输入而转入几个可能的其他状态。在 URL-Detector 中的输入就是当前正在解析的字符。

URL-Detector 可以辨别出如下任意形式的 URL:

它还可以直接解析出关键字,以 http://user@example.com:39000/hello?boo=ff#frag 为例:

  • Scheme – “http”
  • Username – “user”
  • Password – null
  • Host – “example.com”
  • Port – 39000
  • Path – “/hello”
  • Query – “?boo=ff”
  • Fragment – “#frag”

Rocket Data

Rocket Data 是有持续同步层的非阻塞、不可变模型管理系统。它可以使用任何类型的缓存,可以使用简单的 API 来轻松地挂接到键值型存储上。

从 2015 年早期重写 LinkedIn 旗舰版应用时开始,他们就在寻找一个可用的缓存系统来把内容展现给用户,而内容要从网络上加载。总的来说对这套缓存系统的需求是:

  • 不可变,线程安全模型;
  • 模型在内存和缓存中一致。这样在更新模型之后,所有其它实例中的这个模型都会跟着更新;
  • 读写操作都是非阻塞式的;
  • 简单的数据淘汰策略;
  • 在有大量模型类型、模式和监听器时可以容易扩展;
  • 自动迁移;

他们调查了当时业界的各种现有解决方案,包括 Core Data URL Cache Realm ,以及直接将模型写入磁盘的方案等,但找不到哪种方案可以满足上述所有需求,或者保证不可变模型的一致性——这是他们最看重的。于是他们决定自己写一套,就是Rocket Data,它的架构如下:

每一个视图控制器都有一个或多个数据提供者的引用。有两种类型的数据提供者:正规数据提供者持有对单一模型的引用,集合数据提供者持有对模型的有序数组的引用。两种数据提供者都可以很容易很快速地完成数据存取,因为模型都保存在内存中。

Peter Livesey 这样评价这套系统:

有了这套缓存系统,开发者只需一点点额外工作就可以轻松地为项目添加缓存了。缓存和数据提供者都是自动保持一致的。除了每周为一些模型添加模式之外,我们再也不必为迁移增加任何代码。最重要的最,我们程序从来不会因为 Core Data 异常而崩溃。

LayoutKit

LayoutKit 是一个高性能的 iOS 应用视图布局库。

LinkedIn 非常在意手机应用的性能,可第一版的手机应用性能却非常不尽人意,调查后发现原因是主线程在运行 Auto Layout 时花费了过多时间。Auto Layout 是 iOS 提供的布局引擎,可以自动计算视图在屏幕上的大小和位置。

据 LayoutKit 的开发者之一 Nick Snyder,他们当初也做了许多尝试。他们试过手工写布局代码,但发现这样会非常难以维护。所以总之需要的是在保证性能的前提下,将布局功能封装起来的可重用模块。可是调查了现有方案之后,仍是发现虽然 Auto Layout 给大家造成了很大困扰,但合适的方案还是找不到,于是决定自主开发。与 Auto Layout 相比,LayoutKit 的主要优点有:

  • 速度快:性能可以与专门写的定制的布局代码相媲美,比 Auto Layout 快非常多;
  • 异步:在后台线程中做布局运算,所以不会干扰与用户的交互;
  • 声明性的:用不可变的数据结构声明布局,这样更容易开发、审核、调试和维护布局代码;
  • 可缓存的:布局结果都是不可变的数据结构,所以可以在后台线程中计算并缓存,可以非常大的提升性能;

而且 LayoutKit 还很好用:

  • UIKit 友好:LayoutKit 生成 UIView,也提供适配器来方便与 UITableView 和 UICollectionView 一起使用;
  • 国际化:可以自动为从右到左的语言调整视图;
  • Swift:可以在 Swift 应用中使用;
  • 成熟:单元测试覆盖率超过 90%,已经用于最新版的 LinkedIn iOS 应用;

LayoutKit 比 Auto Layout 快八倍,性能可以与专门写的定制的布局代码相媲美。它快在专用的布局算法,而且它也不会为布局创建它并不需要的 UIView。所以开发者可以用它随意的去组合布局,再也不用担心性能问题了。

结束语

开源运动如火如茶,其中 LinkedIn、Google、Twitter 等巨头公司的贡献和推动功不可没。至今 LinedIn 已经为开源社区贡献了 100 多个项目和数十万行代码,包括 Kafka 这样重量级的高吞吐量分布式消息系统。LinkedIn 首席工程师 Jay Kreps 说 LinedIn 会持续投身开源运动:

  • 开源有助于产品保持高标准并引发人们的关注;
  • “让任何事情都成为秘密武器并不是我们热衷的有效战略,内部的(工具和技术)信息并不需要成为我们的竞争优势”。
  • 坚持开源策略是最好的技术招聘广告。很多 LinkedIn 招聘到的人都说这是他们加盟的重要原因。

感谢李建盛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-08-07 19:002105
用户头像

发布了 152 篇内容, 共 65.2 次阅读, 收获喜欢 62 次。

关注

评论

发布
暂无评论
发现更多内容

史上最全的Java容器集合之equals 和 hashCode

自然

集合 Java core 9月月更

【云原生 | 从零开始学Kubernetes】十二、k8spod的生命周期与容器钩子

泡泡

Docker 云计算 云原生 k8s 9月日更

vivo鲁京辉:数据安全与隐私保护是消费者的基本权利,是企业的“铁律”

Geek_2d6073

Java | abstract关键字【面向对象的第三大特征——多态】

Fire_Shield

Java 9月月更 abstract

极客时间-架构师训练营作业-模块一

沐の爹

2022-09-28:以下go语言代码输出什么?A:1 1;B:1 2;C:2 2;D:不确定。 package main import ( “fmt“ ) func main() { var

福大大架构师每日一题

golang 福大大 选择题

Linux下通过tar包方式安装MySQL,详细教程

阿柠xn

运维 MySQL 运维 Linux tar 9月月更

架构实战营模块一作业

π

架构实战营

后疫情时代,RTE“沉浸式”体验还能这么玩?丨RTE 2022 编程挑战赛赛后专访

声网

人工智能

天天都在谈的防火墙到底是个啥,有哪些分类?如何选择防火墙?

wljslmz

网络安全 防火墙 9月月更

开发者有话说|要不是家里穷,我也不想当码农

三掌柜

个人成长 个人感悟

Groovy closure 与Java function转换

FunTester

程序员未来职业规划路线,请收藏

收到请回复

Java 程序员 架构 职业规划 语言 & 开发

挑战Python的语法练习

向阳逐梦

项目实战 9月月更 模块创建

01简单架构分析

神奇的叶叔叔

【最右】面向TS生态的新型Flutter框架

刘剑

typescript 小程序 移动端 动态化 flutter for web

什么是地址转换协议ARP?工作流程是什么样的?

wljslmz

9月月更 ARP

模块一作业

愚人夜行者

APICloud可视化编程(二)

YonBuilder低代码开发平台

前端开发 APICloud 多端开发

详解数据计算能力的四种类型

穿过生命散发芬芳

9月月更 数据计算

Python语法之模块和包(2)

向阳逐梦

9月月更 模块创建 包的应用

【编程实践】详解 MySQL 在 Python 中的使用(2)-pymysql的使用

迷彩

MySQL 数据库 增删改查 pymysql 9月月更 数据库操作

Python语法之异常处理

向阳逐梦

异常处理 9月月更 Python异常处理方法

架构实战训练营模块 1 作业

atcgnu

作业一

Geek_408c99

实战案例,个个是经典,不愧是阿里P7私传“并发编程核心讲义”,竟能讲的如此通透

程序知音

Java 并发编程 多线程 高并发 后端技术

史上最全的Java容器集合之HashMap(源码解读)

自然

集合 Java core 9月月更

作业一

小虎

架构实战营

LinkedIn开源软件项目数量已经超过了100个_语言 & 开发_足下_InfoQ精选文章