作者:鐘科
tseer產品介紹
一.tseer簡介
tseer是一套服務註冊發現容錯的方案,是對tars名字服務功能的輕量化。在騰訊瀏覽器、應用寶、管家、手機書城、騰訊文學、廣點通等眾多業務中廣泛採用,目前日均承載百億級的請求量
tseer輕巧靈便,對業務的侵入性低,非tars服務亦可無縫接入。在服務發現的核心功能之上,tseer還支援多種負載均衡演算法,提供可靠的故障容錯策略,可有效解決業務跨地區跨機房呼叫等難題,極大提公升服務的可用性和呼叫質量,是微服務框架中優秀的名字服務解決方案
tseer擁有web管理介面和api接入兩種方式可供使用者根據需求自由選擇,通過**節點和**伺服器機制為需要頻繁發布變更的業務提供透明的服務發現功能,學習成本很低,操作也很方便,對於業務程式設計客棧維護人員十分友好。
二.研發背景
在傳統的單體式應用中,變更發布相對較少,系統中的網路位置也很少變化,偶爾的變更也可以通過手動更改配置的方式來應對。但是在當前海量服務的大環境下,這種架構已經無法高效穩定的支撐高速增長的業務。越來越龐大的分布式服務集群和微服務框架已經逐漸成為主流。
但是新型架構為業務提供更好支撐的同時,頻繁的發布更新與動態伸縮也導致了網路位置的頻繁變化,在這種情況下業務維護人員手動更改配置這種大規模重複性工作不僅增大了出錯的風險,其低效也會限制業務的高速發展。往往配置還沒改完,新的變更就需要發布了。所以就必須要乙個自動化的服務發現工具來解決這些問題。
然而這些也並不是問題的全部。在保證訪問成功的前提下,www.cppcns.com響應時間作為服務質量中最重要的指標,是影響業務發展最關鍵的一環。多業務集之間複雜的呼叫關係再加上跨地區跨網路呼叫等其他因素,響應時間達不到預期是持續困擾整個業務發展週期的棘手問題。與此同時,無論是採用物理機還是虛擬機器,節點掛掉導致的不可用時有發生,如何有效容錯也是亟待解決的問題。
基於這些問題,我們開發了tseer。
三.tseer架構
整個tseer的結構分為四部分:tseerserver、業務客戶端(主調)、業務服務端(被調)、web管理。
tseerserver
tseerserver是整個tseer的樞紐與核心模組。 當新節點上線時,需要先通過web管理平台在tseer服務集群註冊,將其網路位置資訊記錄在tseer系統中。當需要對節點進行下線或者其他修改時,也需要在web管理平台就行相關操作。被調節點也會定時上報心跳給tseerserver,server端會遮蔽心跳超時的節點使其無法被呼叫。
業務客戶端
業務客戶端是需要呼叫其他服務的節點,稱之為主調,是服務發現功能的使用者。 tseer為業務客戶端提供了:安裝agent與api呼叫兩種方式來從tseerserver獲得需要呼叫的服務(被調)的位址來完成呼叫。
業務服務端
業務服務端是需要被呼叫的節點,稱之為被調,是服務的提供者。 當新節點上線時,被調需要在tseerserver註冊。不論同乙個被調服務集群有多少個節點,註冊時該服務www.cppcns.com集群都需要註冊乙個統一的名字。主調在呼叫邏輯中只需要寫明需要呼叫的服務的名字,tseer會根據被調名字來返回被調位址。當被調需要擴容時,只需要把新節點加在該服務對應的名字下面即可。業務人員無需管理被調集群下繁多的服務節點資訊,十分方便。
web管理
業務資訊及節點路由資訊的增刪改查都是通過web管理介面操作,簡便快捷直觀。甚至agent安裝包都可以通過web平台更新發布。詳細使用方式可參考github上tseer專案的使用文件。
四.tseer功能的特點
1.負載均衡
當同一業務集群中某些節點被頻繁呼叫而另一些節點沒有承擔合理的負載時,不僅業務的服務質量和響應時間會大幅下降,同時也會造成資源的浪費。
tseer系統中,當主調發起呼叫時,會針對被調名字下所有可用節點為呼叫提供四種負載均衡方式來保障各個節點的合理負載,分別是
輪詢 隨機
靜態權重
一致性雜湊
使用者還可以使用呼叫分組的方式來自定義負載均衡實現,呼叫分組會在下文中提到。
2.故障容錯
為了解決節點故障導致的業務不可用與服務質量降低,tseer還提供了可靠的故障容錯機制。
當主調進行一次呼叫之後,會將呼叫結果上報。如果呼叫失敗tseer會暫時將該節點遮蔽來避免故障節點被反覆呼叫,tseer會定時探測被遮蔽的節點,當發現故障節點恢復服務時,會重新將其啟用。
對於任意被調節點,滿足下列條件之一則遮蔽該節點:
1.在乙個檢測週期( 60 秒)內呼叫失敗次數達到 2 次,且呼叫錯誤數占總呼叫次數的50%以上
2.在 5 秒內連續呼叫失敗 5 次以上
對於被遮蔽的節點tseer agent/api將每隔 30 秒對已遮蔽的節點進行重試。
同時當tseer故障時,主調也能根據快取資訊繼續呼叫。
3.呼叫優化
tseer為呼叫邏輯提供idc分組、set分組、all三種方式來解決跨地區呼叫等問題。
all為主調提供所有可用被調節點位址
idc分組
idc分組可以近似的看作就近接入。
該方法按照兩個層次進行劃分。第乙個是物理小組,是最小的組排程單位,即按照節點所在的機房或者區域分配統 一的組名。第二個是物理小組組成的邏輯組,可以理解為按照更大的區域來劃分的統一的組名。
針對idc的邏輯分組,tseer還定義了呼叫優先順序策略。即部分邏輯組不可用時,會按照優先順序策略返回可用被調節點位址列表。
set分組
idc分組主要是在區域概念上去劃分分組,實現就近訪問策略,在後台服務架構中,業務規模達到一定數量時,如果要對某幾個服務節點實現根據容量、灰度,分區域管理的隔離控制,idc分組是無法滿足的,而set分組則是對idc分組的再細化。
set分組的命名規則為: set名.set地區.set組。其中set組是最小區分單元的名稱,支援萬用字元*,表示set地區下的所有分組。比如0,1,2,3, 4 或者a,b,c,d。
set分組的呼叫邏輯如下:
1.主調(客戶端)和被調(服務端)都啟用了set分組,並且set名要一致才認為是啟用同set內
2.啟用set分組的主調和被調只能訪問同set內的節點
3.主調啟用set分組,被調沒有啟用set分組,則缺省會走按idc分組查詢的邏輯(前提是啟用了idc分組)
4.兩種接入方式
根據服務客戶端是否在其物理機中部署tseer agent,tseer的使用方式可以分為agent 和tseer api兩種方式:
agent 方式
名字路由
agent 方式下,tseer agent會定期快取被調方的資訊。並根據呼叫方指定的負載均衡策略將被調節點資訊返給呼叫方。如果呼叫方希望通過服務特性來實現負載均衡,tseer也支援按照呼叫方指定的分組策略將被調的組資訊返給呼叫方。
資料上報
每次呼叫完成後,呼叫方需要呼叫tseer api提供的上報介面上報呼叫資訊,呼叫資訊將由tseer api即使上報至tseer agent。tseer agent將根據呼叫資訊剔除失效被調節點。
容錯使用agent 方式時,如果tseer agent失效,tseer api將會從記憶體中返回已訪問過的節點給主調,如果tseer api快取失效,此時tseer api將會從本地磁碟中的快取檔案恢復快取資訊提供給主調。需要注意的是此時tseer api提供給主調服務的資訊為有損資訊,tseer api不保證節點一定健康。
tseer api方式
名字路由
agen程式設計客棧t 方式與tseer api方式的區別在於是否需要在主調的宿主機中部署tseer agent。tseer api會直接訪問tseer server。並且被調方資訊快取、負載均衡以及失效節點剔除都在tseer api中完成。
tseer api會定時拉取tseerserver的後端資訊並遮蔽不可用的被調節點。
容錯tseerserver故障時,tseer api會將記憶體中快取的資訊返回給主調。當記憶體快取不可用時,tseer api將會用本地磁碟中的快取恢復記憶體快取。
agent api方式 與tseer api方式對比
結語tseer是一套服務註冊發現容錯的方案,是對tars名字服務功能的輕量化,輕巧靈便,對業務的侵入性低。在服務發現的核心功能之上,tseer還支援多種負載均衡演算法,提供可靠的故障容錯策略,可有效解決業務跨地區跨機房呼叫等難題,極大提公升服務的可用性和呼叫質量,是微服務框架中優秀的名字服務解決方案。
免責宣告:本文為使用者投稿的文章,程式設計驛站發布此文僅為傳遞資訊,不代表程式設計驛站贊同其觀點,不對對內容真實性負責,僅供使用者參考之用,不構成任何投資、使用等行為的建議。請讀者使用之前核實真實性,以及可能存在的風險,任何後果均由讀者自行承擔。如有發現
本文位址: /news/media/14036.html
Tseer Tars名字服務功能的輕量化實現
tseer輕巧靈便,對業務的侵入性低,非tars服務亦可無縫接入。在服務發現的核心功能之上,tseer還支援多種負載均衡演算法,提供可靠的故障容錯策略,可有效解決業務跨地區跨機房呼叫等難題,極大提公升服務的可用性和呼叫質量,是微服務框架中優秀的名字服務解決方案。tseer擁有web管理介面和api接...
名字服務consul template
consul template官方文件 consul template 會以例項說明consul template的應用,在例項中會介紹consul template的語法特性!有如下consul集群 有關consul的簡單應用 集群搭建 服務註冊與發現 鍵值管理 click here root t...
用Js實現頁面按名字搜尋功能
在檢視中可以建立這樣乙個空的標籤 js 獲取檢視中輸入的名字的資訊,並發出post請求,將收到的資訊填入層中 function 在載入頁面之前也載入一遍資料,防止在未搜尋的時候沒有任何資料 控制器 將資料從資料庫中取出,放到乙個indextable的分布檢視中 public listgetlistb...