與 Nginx 同行,Pipy究竟有何能耐?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"embedcomp","attrs":{"type":"video","data":{"id":"378021","name":"Flomesh創始人&CEO 專訪","poster":"","url":"https:\/\/media001.geekbang.org\/b090cddd49674409990060c021d2a5d1\/874fd88eed38407986454c6d13b56d7d-dbe5194cf055bb770a226d151371b861-sd.m3u8"}}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作者 | 施堯"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如何精細化管理企業內網流量?來看看 Flomesh 創始人怎麼說"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"互聯網包羅萬象的今天,流量管理無處不在。這一普遍需求,催生了很多流量管理軟件。除了Nginx外,具有代表性的既有Apache httpd、Tomcat、untertow、Lighttpd、Microsoft IIS、IBM WebSphere、Oracle Weblogic等老牌web和應用服務器,也有OpenResty,Envoy等專注於流量管理的新力量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着內網微服務等大型分佈式系統的發展,技術棧從傳統的“內容編程”向“流量編程”演化。這些流量管理軟件都有自身擅長的領域,在互聯網發展、終端形態不斷變化的過程中發揮着重要的作用。與此同時,流量管理從互聯網領域快速進入雲上和企業內網領域,“內(網)外(網)結合、(雲)上(雲)下結合、東西(向流量)南北(向流量)結合”的流量管理能力成爲雲時代的新熱點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Flomesh 成立於 2018年,於今年初開源了Pipy。Pipy 最初爲企業內網提供流量管理服務,經過這幾年的打磨,Pipy如今已成爲“流量編程”領域的新力量,在衆多業務場景中可與Nginx和Envoy一較高低,同時在企業內網這塊空地上獨樹一幟。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲探索 Pipy 的成長之路以及背後的設計思想,以及對“流量編程”領域的前沿思考。近期,小編趁 InfoQ Arch Summit 上海站專訪了 Pipy 開發者蔡書。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/a9\/ef\/a9b340736a749d1c696f2b2eef8934ef.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"蔡書,Flomesh聯合創始人。開源技術愛好者,先後在IBM、RedHat供職多年。2019年開始創建Flomesh,2021年開源其核心Proxy組件Pipy,靜態內容服務和HTTP代理性能全面超越Nginx。目前全職開發和推廣Pipy及其商業化產品,在多家股份制商業銀行成功上線運行,支撐單一客戶日DAU超過一億。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以下是訪談內容整理,分享給大家,Enjoy~"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"定位於流量編程引擎,Pipy的誕生是爲了高效解決流量處理需求"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"主持人:您之前提到過開源的Pipy對標Nginx,而且在性能、擴展性等方面都比Nginx更有優勢,那是不是可以認爲Pipy就是Nginx的替代品?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"**蔡書:**這個問題非常好,身邊好多朋友都問過我這個問題。首先肯定的說我們做Pipy並不是爲了替代Nginx,這裏面有兩層含義,第一是說Nginx本身作爲一個非常優秀的堆棧的Web Server,包含反向代理,負載均衡等經典功能,我們沒有必要重複造輪子去替代他,無論從市場角度還是從技術角度來講,這都沒有必要。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二,Pipy嘗試解決的一些問題我們稱之爲“流量編程”,實際上是Nginx甚至整個行業都還沒有解決的,從技術角度看,整個行業都還沒有一個明確的解決方案,市場也是一片空白。那麼什麼是“流量編程”呢?對於有編程經驗,尤其是瞭解Java編程的人,我們可以認爲Pipy類似netty,是一個高性能、易擴展的框架,基於這個框架可以快速開發出高性能網絡服務程序,如web server。就像vertx基於netty,cassandra也基於netty一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了像Netty封裝了底層網絡API操作外,pipy提供了一個簡化的JS runtime,開發者可以使用JS語法開發上層邏輯。作爲和netty對比,netty是Java編寫的,包含了GC,多線程等特徵;而pipy是單線程事件驅動的,同時pipy有自己的內存管理,基於C++的pipy,規避了類似Java和Go等編程語言常見的GC等“深坑”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"回到nginx的話題,我們在開發過程中需要做功能和性能測試,利用HTTP堆棧的各種工具,測出的數據更有參考意義,更容易對比。舉個例子,採用Pipy跑1000萬請求測試的平均延遲是多少?很多基於HTTP的工具可以使用(wrk, ab, gatling等),也有很多可以對比參考的server實現(nginx, envoy, undertow等),因此我們選擇HTTP堆棧進行基準測試。但是實際上除了HTTP,pipy還支持Redis,Dubbo,socks等協議,並且還在繼續開發支持其他協議。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"再回到Pipy這個話題,Pipy實際上更像一個底層的發動機模版,在這個模版之上我們可以快速開發適配摩托車的發動機,適配汽車的發動機,甚至適配大卡車、越野車,以及適配輪船的發動機。所以從軟件定位上來說,Pipy其實比Nginx要更加底層,是一個全新的領域。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"主持人:您剛剛提到的流量編程概念很新穎,能詳細說說她的來龍去脈嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"**蔡書:**流量編程是一個非常有趣的話題,其目的是滿足流量處理的需求。早期流量處理需求是通過專用的網絡硬件設備來解決。而隨着雲計算的快速發展,很多硬件設施被軟件化,我們看到越來越多的底層資源比如網絡、存儲等被軟件定義,軟件定義的特徵之一就是“可編程”。有一個詞叫做InfrastructureAs Code,說的就是基礎設施可編程。相應地,我們的流量編程是這個細分領域裏的一個子集,爲的是更高效地解決流量處理的需求。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以此爲基礎我們可以將\"HTTP流量編程\"這個模式泛化一下,比如我們是不是可以對MySQL的流量做編程,對一個kafka的請求做編程,對一個Redis的請求做編程,對Dubbo的請求做編程?目前這樣的需求很旺盛。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Nginx在最開始是一個Web Server,它預留了一些擴展接口藉口,可以擴展新的功能,對於HTTP流量編程,Nginx提供了成熟的模型;但是對於非HTTP流量,nginx預留的接口就很簡單了,並不適合擴展開發。一方面接口比較晦澀,不那麼容易使用;另一方面C語言擴展的編程難度還是挺大的,不利於普及。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天在Session裏我會分享一些Pipy的落地應用。舉個例子,我們攔截了Redis請求之後,他訪問的是哪一個Redis的實例,或者哪個集羣?這實際上可以由中間Proxy的環節來決定,需要有一些If else之類的條件進行分流。這個就是“redis流量可編程“的需求。我們把這種能力叫做流量編程,尤其泛指面向應用層的流量處理能力,包括應用程序本身,比如rest請求;當然,也有一部分面向中間件的。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"源起於定製化修改報文,Pipy要做流量通路上的智能交通系統"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"主持人:您開發Pipy的時候,看到了哪些當時還沒有被滿足的市場需求,或者說客戶的具體需求?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"**蔡書:**這個話題非常好,回到本源來說,這個問題就是所謂的“Pipy從哪裏來”這樣的經典話題。實際上最開始的時候,我們在編程過程中發現客戶有一些需求具有行業共性。舉個例子,銀行客戶常用的定長報紋,需要固定前6個字節作爲報頭。醫療、電信和泛金融行業也希望類似信息能夠被路由,被取樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一開始,我們去找相應工具比如openresty去解決這個問題,但發現它缺少一個抽象層。於是我們打算從下往上寫,自己寫一個socket程序,但後來也發現這樣開發的應用維護和擴展難度很大。最後我們嘗試在應用協議和底層socket之前加入一個抽象層,這個抽象層解決了底層編程的複雜度,同時又提高了現場開發的效率。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那我們就發現存在這樣的一些行業性需求未被滿足,我們沿着這條路走下去不僅可以解決專屬的行業業務問題,還可以解決泛化的技術領域的問題,比如Redis的問題,比如Kafka的問題。於是我們不斷地迭代,到現在三年時間,Pipy已經越來越通用,能解決更多需求了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"主持人:Pipy開發的整個藍圖是什麼樣的,現在進行到哪一步了?接下來有什麼樣的計劃呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"**蔡書:**我們的藍圖可以類比交通系統。城市中的公路網絡一樣,有環路,有小衚衕,各處的交通設備可以管車流量,管traffic。對於我們來說,在一個企業內部網絡中,如果規則明確並且遍佈足夠多的proxy,就像城市裏每一個路口設置了足夠多的標識符,那麼交通流量就可以自動地做智能化調度,類似自動駕駛。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"繼續想象道路系統,首先道路上有一些可識別的東西,那麼無人駕駛系統就可以自動根據設定的路線行駛。對於我們來說,我們的第一步是鋪設所有控制點,這是類似紅綠燈的基礎設施。Pipy在整個藍圖中是一個開始,它只是一個小組件,負責爲流量導航。接下來我們會開發控制體系,也就是基於這些“標識”的“智能交通”體系。這樣企業內網的流量就可以高效、可控、安全、智能的自動流動,並且需要更少的人工干預。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下一階段我們會佈置一些控制器(Controller),用來適配K8s,阿里雲,AWS等,甚至可以和傳統網絡設備耦合。最終構建出一個完整的可自動調度流量的控制體系。這是我們的整個藍圖。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"主持人:您覺得未來在流量管理這個領域中,行業集中度會如何發展?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"**蔡書:**首先我們看到這種細粒度的智能流量管理是最近幾年才演化出來的,也就是說變革纔剛剛開始。很早之前大家靠手工去配置網絡,設定流量傳輸規則;2017年左右隨着微服務體系的普及,單一集羣節點變多,智能流量管理的需求越來越旺盛,於是很多團隊開始嘗試解決這類需求,典型的有Nginx,envoy,Linkerd等等。除此外還有客戶自己編寫工具,典型的有traefik,百度的BFE等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們認爲這個領域在未來幾年會是百花齊放的階段。然後慢慢地,整個領域會收斂;由於產品性能,資源佔用率等原因,最後可能只剩2~3個成熟產品。那從終局來看,能同時做到高性能,低延遲,可擴展,可編程而且學習曲線容易被大衆接受,這件事並不容易。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於我們而言,我們希望在普及度,易用性方面多下功夫,希望這條路能一直走下去,到最後留下的成熟產品中有我們一個。"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章