社交網絡巨頭、開源社區的活躍貢獻者LinkedIn最近又開源了一系列重量級基礎設施軟件。到目前為止,LinkedIn在GitHub上開源的軟件項目數量已經超過了100個。
URL-Detector
URL-Detector是一個以文本方式檢測和標準化URL的Java庫。為了保證用戶的安全使用,所有用戶提交的內容都會經過安全檢測。LinkeIn的內容驗證服務每秒鐘都要處理幾十萬個URL,檢查其中是否有惡意軟件或釣魚軟件。LinkdedIn的高級軟件工程師Tzu-Han Jan說:
如果提交的內容是一個URL,我們就直接用我們的內容驗證服務去檢查。如果提交上來的是一大堆文本,那就先用URL-Dector算法把可能的URL從中提取出來,再把URL交給內容驗證服務。
他們設計了一個有限狀態自動機來從文本中提取URL。有限狀態自動機是一個包含了若干狀態的系統,每個狀態可能根據不同的輸入而轉入幾個可能的其他狀態。在URL-Detector中的輸入就是當前正在解析的字符。
URL-Detector可以辨別出如下任意形式的URL:
HTML 5 Scheme – //www.linkedin.com Usernames – user:[email protected] Email – [email protected] IPv4 Address – 192.168.1.1/hello.html IPv4 Octets – 0x00.0x00.0x00.0x00 IPv4 Decimal – http://123123123123/IPv6 Address – ftp://[::]/helloIPv4-mapped IPv6 Address –http://[fe30:4:3:0:192.3.2.1]/
它還可以直接解析出關鍵字,以http://[email protected]: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旗艦版應用時開始,他們就在尋找一個可用的緩存系統來把內容展現給用戶,而內容要從網絡上加載??偟膩碚f對這套緩存系統的需求是:
不可變,線程安全模型; 模型在內存和緩存中一致。這樣在更新模型之后,所有其它實例中的這個模型都會跟著更新; 讀寫操作都是非阻塞式的; 簡單的數據淘汰策略; 在有大量模型類型、模式和監聽器時可以容易擴展; 自動遷移;他們調查了當時業界的各種現有解決方案,包括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招聘到的人都說這是他們加盟的重要原因。