close

模式之服務網格

易觀從傳統的媒體出身,到現在技術產品收入占到總收入的一半以上,得益於易觀的技術產品轉型。易觀 CTO 郭煒為大傢帶來易觀大數據架構的變遷,從技術角度來講述易觀大數據技術架構從2015年到2017年變遷和2018年的規劃及取得的成效。




易觀從傳統的媒體出身,到現在技術產品收入占到總收入的一半以上,得益於易觀的技術產品轉型。易觀 CTO 郭煒為大傢帶來易觀大數據架構的變遷,從技術角度來講述易觀大數據技術架構從2015年到2017年變遷和2018年的規劃及取得的成效。




大部分人認為銀行業非常傳統、與大數據和高科技關系不大。從大數據的 3V 特性到銀行業的實際需求,銀行業都是最適合大數據的行業。本文給出瞭銀行業成功應用大數據的案例,並對未來做出瞭預測。




買單俠專門為線下走進消費場景的藍領和初級白領提供消費分期的服務,和線下的手機、電動車、醫美行業都有著密切的合作,合作城市超過 200 個。如何有效的控制風險、防止欺詐?創業三年如何從不到 10 人發展到超過 300 人的技術產品團隊?聽聽買單俠 CTO 、EGO 上海分會會員李炫熠的分享。




從構建階段到傳輸至生產運行階段,容器在每個階段都面臨著安全風險。容器防護需要在整個棧及部署過程中引入一種分層安全策略。




分佈式系統為我們帶來瞭各種可能性,同時也引入瞭各種問題。如果系統不是很復雜,工程師們一般會盡量避免進行遠程交互,降低分佈式系統與生俱來的復雜性。使用分佈式系統最安全的方式就是盡可能避免分佈式,盡管這樣會讓散佈的系統出現重復的邏輯和數據。

但行業的發展促使我們邁出更大的步伐,大型的集中式服務變成瞭數百個甚至數千個小型服務。我們不得不去解決新的挑戰,先是一些個別案例,後來問題變得越來越復雜。在不斷挖掘出新問題並設計出更好的解決方案之後,我們開始學會總結,將一些常見的需求總結成模式、庫,甚至是平臺。

最初的網絡計算機交互

最開始人們想象的計算機之間的交互方式是這樣的:


上面這個模型的變種從50年代開始就得到廣泛應用。起初,計算機很稀有,也很昂貴,人們手動管理計算機之間的連接。隨著計算機變得越來越普及,價格也沒那麼貴瞭,計算機之間的連接數量和數據量出現瞭瘋狂式的增長。人們越來越依賴網絡系統,工程師們必須確保他們開發的服務能夠滿足用戶的要求。

於是,如何提升系統質量成為人們關註的焦點。機器需要知道如何找到其他節點,處理同一個通道上的並發連接,與非直接連接的機器發生通信,通過網絡路由數據包,加密流量

除此之外,還需要流量控制機制。流量控制可以防止上遊服務器給下遊服務器發送過多的數據包。在網絡系統中,至少會存在兩臺對彼此毫無所知的機器。比如,服務器A按照一定速率向服務器B發送數據包,但服務器B並不能保證及時處理這些數據包。服務器B有可能同時在處理其他任務,又或者數據包到達的順序發生顛倒,服務器B一直在等待本應先到達的數據包。在這種情況下,不僅服務器A的請求無法得到響應,而且還可能讓服務器B過載,因為服務器B需要把數據包放進未處理隊列。

在一段時期內,開發人員需要在自己的代碼裡處理上述問題。在下圖的示例中,為瞭確保不給其他服務造成過載,應用程序需要處理網絡邏輯,於是網絡邏輯和業務邏輯就混雜在一起。

所幸的是,技術發展得很快,TCP/IP這類標準的出現解決瞭流量控制等問題。盡管網絡邏輯代碼依然存在,但已經從應用程序裡抽離出來,成為操作系統網絡層的一部分。

微服務的出現

時過境遷,計算機越來越普及,也越來越便宜,上述的網絡技術棧已經被證實是構建可靠連接系統行之有效的方案。相互連接的節點越來越多,業界出現瞭各種網絡系統,如分佈式代理和面向服務架構。

分佈式為我們帶來瞭更高層次的能力和台中抽水肥推薦好處,但挑戰依然存在。有些挑戰是全新的,但也有一些隻是舊有問題的升級,比如我們之前討論的網絡問題。

在90年代,來自Sun Microsystems的Peter Deutsch等人發表瞭 The8 Fallacies of Distributed Computing 。Peter列出瞭人們在使用分佈式系統時容易做出的幾項假設。Peter指出,如果隻是針對原始網絡架構或理論模型,那麼這些假設或許是對的,但在現實世界中絕對不是。


微服務架構是更為復雜的分佈式系統,它給運維帶來瞭更多挑戰。我們之前已經做過一些詳細的討論,下面是之前討論內容的要點。


盡管數十年前出現的TCP/IP協議棧和通用網絡模型仍然是計算機通信最為有力的工具,但一些更為復雜的架構也催生瞭一些新的需求,工程師們需要在系統中加入一個新的層。

我們以服務發現和回路斷路器為例,這兩種技術被用於解決彈性和分佈式問題。

歷史總是驚人的相似,第一批采用微服務架構的企業遵循的是與第一代網絡計算機系統類似的策略。也就是說,解決網絡通信問題的任務又落在瞭工程師的肩上。

服務發現的目的是找到有能力處理請求的服務實例。比如,有個叫作Teams的服務需要找到一個叫作Players的服務實例。通過調用服務發現,可以獲得一個滿足條件的服務器清單。對於單體系統來說,這個可以通過DNS、負載均衡器和端口機制(比如通過HTTP服務器的8080端口來綁定服務)來實現。而在分佈式系統裡,事情就復雜瞭,服務發現需要處理更多的任務,比如客戶端負載均衡、多環境(如staging環境和生產環境)、分佈式服務器的物理位置等。之前可能隻需要一行代碼來處理服務器名問題,而現在需要更多的代碼來處理更多的邊界問題。

Michael Nygard在他的 Release It 一書中提到瞭回路斷路器模式。Martin各級學校抽化糞池 Fowler也對該模式做瞭總結:


回路斷路器背後的原理其實很簡單,將函數封裝在回路斷路器對象裡,當故障率達到某個閾值,回路斷路器開始發揮作用,所有發給回路斷路器的請求都將返回錯誤,這些請求無法觸及到被保護的函數。通常情況下,還需要在回路斷路器打開時發出告警。


這是一種非常簡單但能保證服務間交互可靠性的解決方案。不過,隨著分佈式規模的增長,任何事情都會趨於復雜。在分佈式系統裡,發生問題的概率呈指數級增長,即使是最簡單的事情也不能等閑視之,比如像 在回路斷路器打開時發出告警 這樣的小事。一個組件發生故障將會級聯地影響到多個客戶端,一傳十,十傳百,最後可能有數千個回路同時被打開。先前的問題隻需要幾行代碼就可以解決,而現在需要更多的代碼才能解決這些新問題。

要實現好上述的兩種模式是很困難的,不過像Twitter的Finagle和Facebook的Proxygen這樣的大型框架為我們提供瞭很多便利。

很多采用瞭微服務架構的公司遵循瞭上圖中的模型,如Netflix、Twitter和SoundCloud。不過隨著服務數量的增長,這個模型也時常出現一些問題。

即使一個公司使用瞭Finagle,仍然需要投入時間和精力去打通各個系統。從我在SoundCloud和DigitalOcean的經驗來看,一個擁有100到250個工程師的企業,至少需要投入十分之一的人力在構建工具上。這種成本有時候是顯而易見的,因為一部分工程師被安排專職負責構建工具,但有時候它也會存在於無形,並 吞噬 掉本該用於構建產品的時間。

第二個問題是,上述的方案會限制可用的工具、運行時和編程語言。微服務軟件庫一般專註於某個平臺,使用瞭某種編程語言或使用瞭某種運行時(如JVM)。如果一個公司選擇瞭另一個不支持原先軟件庫的平臺,那麼就要將代碼重新移植到新平臺上。移植過程需要耗費大量的工程時間,工程師們忙於構建工具和基礎設施,無暇顧及業務和產品。這也就是為什麼一些中型公司決定隻支持單一的平臺,比如SoundCloud僅支持Scala,DigitalOcean僅支持Go語言。

最後一個是監管問題。盡管軟件庫封裝瞭功能,但組件本身仍然需要維護。要確保數千個服務使用的是同一個版本(或至少是兼容的版本)的軟件庫並不是件容易的事。每做出一次變更都需要進行集成、測試,還要重新部署所有的服務 盡管服務本身並沒有發生變化。

與網絡協議棧一樣,我們急切地希望能夠將分佈式服務所需要的一些特性放到底層的平臺中。

人們基於HTTP協議開發非常復雜的應用,無需關心底層TCP如何控制數據包。在開發微服務時也是類似的,工程師們聚焦在業務邏輯上,不需要浪費時間去編寫服務基礎設施代碼或管理系統用到的軟件庫和框架。

把這種想法囊括進我們的架構中,就是下圖所示的樣子。

不過,在網絡協議棧中加入這樣的一個層是不實際的。很多先驅者們使用一系列代理,也就是說,一個服務不會直接與它的依賴項發生連接,所有的流量都會流經代理,代理會實現所有必需的特性。

在首批有文檔記錄的開發案例中,出現瞭邊車(sidecar)這個概念。邊車就是與應用程序一起運行的獨立進程,為應用程序提供額外的功能。2013年,Airbnb開發瞭Synapse和Nerve,也就是邊車的一種開源實現。一年之後,Netflix發佈瞭Prana,它也是一個邊車,可以讓非JVM應用接入他們的NetflixOSS生態系統。在SoundCloud,我們也開發瞭一些邊車,讓遺留的Ruby應用可以使用我們為JVM微服務而構建的基礎設施。

(點擊放大圖像)

大多數開源的代理是為特定的基礎設施組件而設計的。例如,Airbnb的Nerve和Syna台中化糞池清理pse假設服務一定是註冊到ZooKeeper上的,而Prana要求一定要使用Netflix自己的Eureka註冊服務。

隨著微服務架構日漸流行,我們也看到瞭新一波的代理可以用在不同基礎設施組件上。Linkerd就是其中較為出名的一個,它是Buoyant公司基於Twitter微服務平臺而開發的。而不久之前,Lyft宣佈Envoy成為CNCF的官方項目。

Service Mesh(服務網格)

在這樣的模型裡,每個服務都會有一個邊車代理與之配對。服務間通信都是通過邊車代理進行的,於是我們就會得到如下的部署圖。

Buoyant的CEO William Morgan發現,代理之間的連接形成瞭一種網格網絡。2017年初,William對這樣的平臺做出瞭定義,並稱之為Service Mesh:


服務網格是一個基礎設施層,用於處理服務間通信。雲原生應用有著復雜的服務拓撲,服務網格保證請求可以在這些拓撲中可靠地穿梭。在實際應用當中,服務網格通常是由一系列輕量級的網絡代理組成的,它們與應用程序部署在一起,但應用程序不需要知道它們的存在。


這個定義最強有力的部分在於,它不再把代理看成單獨的組件,並強調瞭這些代理所形成的網絡的重要性。

組織開始將他們的微服務部署到更為復雜的運行時(如Kubernetes和Mesos)上,並開始使用這些平臺提供的網格網絡工具。他們正從使用一系列獨立運行的代理轉向使用集中式的控制面板。

(點擊放大圖像)

從鳥瞰圖中可以看到,服務的實際流量仍然在代理間流轉,不過控制面板對每一個代理實例瞭如指掌,通過控制面板可以實現代理的訪問控制和度量指標收集。

最近發佈的Istio就是這類系統最為突出的代表。

我們還無法對Service Mesh將給大規模系統帶來怎樣的影響做出全面的定論,不過我們至少可以看到兩個方面的優勢。首先,微服務架構的一些公共組件已經是現成的,很多小公司可以享受到之前隻有大公司才能享受的一些特性。其次,我們或許能夠因此使用最好的工具和編程語言,而無需擔心不同平臺對軟件庫和模式的支持存在差異。

查看原文:Pattern: Service Mesh

感謝雨多田光對本文的策劃和審校。


您需要 註冊一個InfoQ賬號 或者

登錄 才能進行評論。在您完成註冊後還需要進行一些設置。

獲得來自InfoQ的更多體驗。






我們發現您在使用ad blocker。

我們理解您使用ad blocker的初衷,但為瞭保證InfoQ能夠繼續以免費方式為您服務,我們需要您的支持。InfoQ絕不會在未經您許可的情況下將您的數據提供給第三方。我們僅將其用於向讀者發送相關廣告內容。請您將InfoQ添加至白名單,感謝您的理解與支持。

台灣電動床工廠 電動床

台灣電動床工廠 電動床

AUGI SPORTS|重機車靴|重機車靴推薦|重機專用車靴|重機防摔鞋|重機防摔鞋推薦|重機防摔鞋

AUGI SPORTS|augisports|racing boots|urban boots|motorcycle boots

一川抽水肥清理行|台中抽水肥|台中市抽水肥|台中抽水肥推薦|台中抽水肥價格|台中水肥清運

arrow
arrow

    icm062q0i2 發表在 痞客邦 留言(0) 人氣()