2016-10-09 25 views

回答

2

這些數字(「1:」和「2:」)是參數的序數值。序數是表達「在一系列中的位置」的奇妙方式,但是,數字不必是連續的,而是唯一的。

[TLDR]

在Apache中節儉IDL,序號被分配給一個參數列表中的每個參數和每個字段在一個結構。當客戶端程序調用Apache Thrift服務器時,它們不傳遞參數名稱,它們傳遞更小的序數,一個代表參數類型和序列化參數值的數字。

這不僅可以節省線路空間,還可以隨時添加參數到一個功能,並以任何順序發送參數而不會破壞客戶端或服務器。如果Apache Thrift程序收到一個帶有序號的參數,它將無法識別它忽略它。

此外,如果缺少參數,可以使用默認值。下面是與分配給allowPartialMatch參數的默認值另一個例子服務:

service SocialLookup { 
    string GetSiteByRank(1: i32 rank) 
    i32 GetSiteRankByName(1: string name, 2: bool allowPartialMatch=false) 
    list<string> GetSitesByUsers(1: i32 minUserCount, 2: i32 maxUserCount) 
} 

如果客戶端調用GetSiteRankByName方法和param「2:」不通過,則使用默認值。如果要發佈各個服務的新版本,而無需同時更新服務的所有用戶,則允許接口像這樣發展非常重要。微服務和CI/CD。

重要的是,一旦設置,您不應該更改序號,因爲它可能導致給定的客戶端和服務器誤解對方。您可以刪除參數,但最好將它們註釋掉,以便每個人都知道不要重複使用序號。

[/ TLDR]

1

人們可能添加,這些數字是客戶端和服務器之間用於識別一個特定的字段中的僅信息。字段名通常甚至不會被序列化成消息。

+1

偉大的一點!序號的全部目的是消除序列化大字段名稱的需要,這很重要(事實上很關鍵)。 – codeSF