1: 在 thrift 参数列表中是什么意思
What does 1: mean in thrift parameter list
节俭的例子website
int multiply(1:int n1, 2:int n2);
为什么我们必须在变量名前使用标签1:
和2:
,这个标签的作用是什么?
这些数字(“1:”和“2:”)是参数的序数值。序号是 "position in a series" 的一种奇特表达方式,但是,数字不必是连续的,只需唯一即可。
[TLDR]
在 Apache Thrift IDL 中,序号被分配给参数列表中的每个参数和结构中的每个字段。当客户端程序调用 Apache Thrift 服务器时,它们不传递参数名称,而是传递更小的序号,一个表示参数类型和序列化参数值的数字。
这不仅节省了 space 的在线时间,还允许您随着时间的推移向函数添加参数,并以任意顺序发送参数,而不会中断客户端或服务器。如果 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]
有人可能会补充说,这些数字是 仅 客户端和服务器之间用于标识特定字段的信息。字段名称通常甚至没有序列化到消息中。
节俭的例子website
int multiply(1:int n1, 2:int n2);
为什么我们必须在变量名前使用标签1:
和2:
,这个标签的作用是什么?
这些数字(“1:”和“2:”)是参数的序数值。序号是 "position in a series" 的一种奇特表达方式,但是,数字不必是连续的,只需唯一即可。
[TLDR]
在 Apache Thrift IDL 中,序号被分配给参数列表中的每个参数和结构中的每个字段。当客户端程序调用 Apache Thrift 服务器时,它们不传递参数名称,而是传递更小的序号,一个表示参数类型和序列化参数值的数字。
这不仅节省了 space 的在线时间,还允许您随着时间的推移向函数添加参数,并以任意顺序发送参数,而不会中断客户端或服务器。如果 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]
有人可能会补充说,这些数字是 仅 客户端和服务器之间用于标识特定字段的信息。字段名称通常甚至没有序列化到消息中。