1:在thrift参数列表中意味着什么

时间:2016-10-09 08:37:13

标签: thrift

来自节俭website

的例子
int multiply(1:int n1, 2:int n2); 

为什么我们必须在变量名称之前使用标签1:2:,这个标签的目的是什么?

2 个答案:

答案 0 :(得分:2)

这些数字(“1:”和“2:”)是参数的序数值。 Ordinal是一种说“系列中的位置”的奇特方式,然而,数字不一定是连续的,只是唯一的。

<强> [TLDR]

在Apache Thrift 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方法并且未传递参数“2:”,则使用默认值。允许接口像这样发展在您希望发布单个服务的新版本的环境中非常重要,而无需同时更新服务的所有用户,例如,微服务和CI / CD。

重要的是,一旦设置,您就不应该更改序号,因为它可能导致给定的客户端和服务器相互误解。您可以删除参数,但最好将其注释掉,以便每个人都知道不要重复使用序数。

<强> [/ TLDR]

答案 1 :(得分:1)

有人可能会补充说,这些数字是客户端和服务器之间用于标识特定字段的唯一信息。字段名称通常甚至不会序列化为消息。