超越 Nginx?雲原生時代的流量發動機 pipy

應用流量管理是數字化時代的重點、要點和難題

1 內網流量管理 -- Nginx 的短板

對於其顯著的高效率優勢,Nginx 的核心原理並不複雜 -- 採用:多進程 + 異步非阻塞方式(IO 多路複用 epoll/kqueue)處理流量。但這在 Nginx 普及之前並沒有被大規模採用,也就是說,在 2003 年這是一個十分典型的創新。

如今,Nginx 依舊是 Web/HTTP 流量管理領域當之無愧的 “頭牌”。也由於它的存在,市面上大量的流量管理軟件可被簡單分三類,分別是 Nginx 及 Nginx 衍生品,基於高性能 Java 和 Go 的堆棧(如 Netty),以及近幾年剛發展起來的 Envoy。Nginx 擁有良好的生態,其核心價值在於專注處理內外網之間的邊界流量,也就是主要處理 HTTP 流量,具有資源佔用少,高效、易用、靈活等特點。

然而,企業內網應用流量要複雜得多。企業內部除了 HTTP 流量外,還有大量的非 HTTP 流量,包括各種 RPC 類、中間件類、以及私有協議等,因此需要一個框架以及完整的堆棧來處理相關流量。擅長 HTTP 的 Nginx 此時難於滿足新的需求;新的流量管理需求,需要兼顧多協議、靈活度,擴展性和資源佔用等更多方面。

Envoy 在看到 Nginx 這方面的不足後,快速發展起來,實際使用者反饋,Envoy 一方面具有較高的認知度,但另一方面其擴展開發難度大、接口複雜、資源佔用較高 (基本場景使用時就需佔用高達數百兆內存),也爲用戶帶來了困惑。

因此,一個擅長處理企業內網流量、資源佔用低、高性能、易擴展的流量管理工具成爲當下雲原生時代強烈的需求。

近期,我們採訪了易衡科技 CEO 蔡書,就其開源的 pipy 流量管理軟件進行了深度交流溝通,現結合精彩內容爲大家分享 pipy 的設計理念,產品架構以及未來願景。

2 新一代的流量管理工具 -- pipy

2018 年,有用戶找到蔡書,提出需要定製企業內網流量管理軟件。其中的一個需求很簡單,在一個 TCP 報文中用 6 個字節表示長度,6 個字節之後是報文內容。蔡書的團隊一開始計劃用 Nginx 做基礎,擴展開發相應組件解決滿足需求。但發現 Nginx 非 HTTP 協議的擴展並不是很成熟,缺乏框架級的能力,靈活度難於滿足需求,當客戶需要增減報文長度和處理更加結構化的報文時,Nginx 在 4 層面向字節流的編程模式,複雜且代碼難於重用。

與此同時,團隊也考察了用 Envoy 解決問題的思路,也遇到很大的挑戰。“Envoy 提供的編程接口和使用接口都比較複雜,不夠直接,易用性難於滿足需求,且會帶來更高的運維複雜度和成本;同時 Envoy 在資源 (如內存) 管理、長時間高負載下穩定程度也遇到了問題,如突然變大的延遲”。

最後蔡書及其團隊調研了市面上典型的同類軟件,綜合評估易用性、可維護性、資源佔用率、性能以及擴展性後,發現處理企業內網流量的場景下,目前還沒有工具能很好的滿足需求。於是萌發了重新開發流量管理工具的念頭;因爲這個程序採用了流水線 pipeline 的處理模型,故將其取名爲 pipy。

無心插柳柳成蔭,創新的背後是對趨勢的深刻思考

“從我們自己的角度而言,做這樣一個工具首先是基於大量調研,然後,我們開發迭代大概兩年之後發現我們自己迭代出來的模型除了靈活外,還有其他的優勢,尤其在資源佔用和性能方面是領先的。” 聊到開發 pipy 的初衷,蔡書認爲他們的想法只是萌生於一個簡單的瞬間,回頭去看,有些無心插柳柳成蔭的意味。

但其實,在輕描淡寫背後,有着對技術趨勢的深刻思考和把握。蔡書認爲,在雲原生時代,內網流量 “編程級的管理能力” 需求正變得越來越旺盛,且分佈於各種規模的組織中,從互聯網到企業,都有需求。這些需求呈現複雜多變的特徵,並且很多都是“急活”-- 如用戶在短期內需要將具有某些特徵的流量做特定的處理。“想要駕馭複雜多變的需求和環境,就需要從長期穩定不變的事物入手,以靜制動。過去 20 年,變化最少的就是網絡協議,那就從協議入手解決問題”,蔡書說。其核心思路就是協議可擴展、流量可編程。

蔡書團隊開發的 pipy 在 4 層字節流和 7 層協議中間抽象出了 “對象流” 的概念,可以快速的實現各種 7 層協議。事實上,pipy 中借鑑和採用了很多編譯領域的思路和處理方法。這種抽象,不僅可以快速做協議層擴展,同時也實現了很高的性能和很低的資源佔用。

比如在 “對象流” 的模型上用 pipy 開發一個基本的 HTTP 靜態內容服務器,和 Nginx 做靜態內容 Web 服務相比,pipy 在使用更少內存情況下,性能比 Nginx 還要好。除了注重協議層擴展能力外,pipy 還引入了 JavaScript 引擎,使用 JavaScript 語法可以快速定製 7 層的邏輯,比如基於協議某個特定字段做特定邏輯的處理。pipy 的第一個開源版本使用了 QuickJS 作爲 JS 引擎;在最近的更新中,pipy 團隊進一步開發了 “羽量級” 的 JS 處理框架 PJS(pipy-javascript),使得 pipy 更快、更小、更易用。

簡單、高效、實用,一個極客的極致追求

簡單、高效、實用是 pipy 最典型的三個特徵。如今,pipy 的誕生已經接近三年,產品形態日趨穩定。從其架構圖來看,整個技術棧共分 10 層(包含終端用戶產品層),基本設計理念是通過分層將複雜問題抽象出來,化整爲零再進行處理。

其中,pipy Proxy 分了三層,#2 層實現字節流處理,而 #3 層是對象流,#4 層是消息流,用來支持 7 層協議。從下至上每一層的擴展性、性能、穩定性都決定了上一層的擴展性、性能、穩定性。

最上面分別是 Operator(#5、#6、#7)和用戶接口(#9、#10、#11 號)層,他們共同構成控制平面,控制平面開發以 Go 爲主。用戶接口和應用接口,統一通過 REST API 交互;這些 REST API 也用於和 DevOps 等工具集成。

3 雲原生時代的流量管理發動機

“我們認爲這個工具很有價值,想讓它更快更好地成長並服務於更廣泛的羣體,於是我們把核心部分剝離出來,做成了一個開源項目”

(https://github.com/flomesh-io/pipy)。

聊到未來的規劃時,蔡書興高采烈的介紹了他們開源的初衷,接着提到即將到來的版本改進,在新版本 pipy 中,我們定義了一些關鍵性的能力擴展計劃。

擴展計劃主要涉及安全能力以及分析能力兩個板塊。安全能力提供了基礎的過濾、識別、加解密、加驗籤等基礎功能,用戶可以基於此快速實現定製化的安全功能,這部分將很快內測。分析能力包括流量抓取、數據採集功能,通過流量管理引擎抓取數據,將其結構化之後對外輸出,用於第三方分析,如大數據、安全自動化等。

優秀的軟件來自深思熟慮、精湛技藝和長期的打磨。如今的 pipy 還處於新生兒時期,但其團隊的技術能力和長遠目標都十分優異,同時還具有很強的洞察趨勢,把握趨勢的能力,對未來擁有清晰的開發計劃,十分值得期待。

聊到未來願景時,蔡書提到,我工作了 20 年以後開始研發 pipy,我對於 pipy 的目標是希望它最後能做成流量管理的 “發動機”,在此之上能生長出繁榮的生態。就好像研發出一個優秀的發動機,有了它可以擴展出轎車、越野車、卡車,甚至可以裝在帆船上。最終成爲支撐數字時代和雲原生時代的堅實的基礎軟件設施。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ItnB259rC1nR7JJZYDSZYA