【发布时间】:2018-04-14 18:03:32
【问题描述】:
在thrift IDL中,服务响应也可以是list还是map?
因为,通常我看到它是一些结构或一些原始类型,如字符串、双精度等。
另外,我可以验证的来源是什么?还请注明出处。
【问题讨论】:
标签: thrift
在thrift IDL中,服务响应也可以是list还是map?
因为,通常我看到它是一些结构或一些原始类型,如字符串、双精度等。
另外,我可以验证的来源是什么?还请注明出处。
【问题讨论】:
标签: thrift
当然可以:
service FooBar {
list<double> Foobarizer()
}
完全合法。
那么为什么人们要使用结构呢?好吧,它使 API 可扩展。这与所谓的"soft versioning" 有关。
考虑您要添加另一个标志,以提供一些有价值的附加信息。我们如何将其添加到响应中?只有一个列表,你就迷路了,因为把它改成类似的东西
struct FoobarizerReturn {
1: list<double> data
2: bool theValuableInfo // added in V2
}
service FooBar {
//list<double> Foobarizer()
FoobarizerReturn Foobarizer()
}
本质上会破坏旧客户端的 API。 为了保持兼容,您必须像这样更改 IDL:
service FooBar {
/** V1 deprecated */
list<double> Foobarizer()
/** V2 use this now */
FoobarizerReturn FoobarizerV2()
}
至少有三个缺点:
因此,最前向兼容的解决方案是从头开始使用结构,以后可以根据需要轻松扩展该结构,而不会破坏兼容性。
struct FoobarizerReturn {
1: list<double> data
// more data to come later
}
service FooBar {
FoobarizerReturn Foobarizer()
}
【讨论】: