天天看點

LinkedIn 開源軟體項目數量已經超過了 100 個

社交網絡巨頭、開源社群的活躍貢獻者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中的輸入就是目前正在解析的字元。

LinkedIn 開源軟體項目數量已經超過了 100 個

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

ipv6 address – ftp://[::]/hello

ipv4-mapped ipv6 address –

<a href="/">http://[fe30:4:3:0:192.3.2.1]/</a>

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,它的架構如下:

LinkedIn 開源軟體項目數量已經超過了 100 個

每一個視圖控制器都有一個或多個資料提供者的引用。有兩種類型的資料提供者:正規資料提供者持有對單一模型的引用,集合資料提供者持有對模型的有序數組的引用。兩種資料提供者都可以很容易很快速地完成資料存取,因為模型都儲存在記憶體中。

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 開源軟體項目數量已經超過了 100 個

結束語

開源運動如火如茶,其中linkedin、google、twitter等巨頭公司的貢獻和推動功不可沒。至今linedin已經為開源社群貢獻了100多個項目和數十萬行代碼,包括kafka這樣重量級的高吞吐量分布式消息系統。linkedin首席工程師jay kreps說linedin會持續投身開源運動:

開源有助于産品保持高标準并引發人們的關注;

“讓任何事情都成為秘密武器并不是我們熱衷的有效戰略,内部的(工具和技術)資訊并不需要成為我們的競争優勢”。

堅持開源政策是最好的技術招聘廣告。很多linkedin招聘到的人都說這是他們加盟的重要原因。

繼續閱讀