Thrift IDL:服务响应列表
Thrift IDL : service response as list
在thrift IDL中,服务响应也可以是list或map吗?
因为,通常我看到它是一些结构或一些原始类型,如字符串、双精度等
另外,我可以验证的来源是什么?还请注明出处。
当然可以:
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()
}
至少有三个缺点:
- 服务器端需要额外的代码
- 它会导致客户端的额外工作
- 只是屁股丑(这是一个专业术语)
因此,最向前兼容的解决方案是从头开始使用结构,以后可以根据需要轻松扩展w/o破坏兼容性。
struct FoobarizerReturn {
1: list<double> data
// more data to come later
}
service FooBar {
FoobarizerReturn Foobarizer()
}
在thrift IDL中,服务响应也可以是list或map吗?
因为,通常我看到它是一些结构或一些原始类型,如字符串、双精度等
另外,我可以验证的来源是什么?还请注明出处。
当然可以:
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()
}
至少有三个缺点:
- 服务器端需要额外的代码
- 它会导致客户端的额外工作
- 只是屁股丑(这是一个专业术语)
因此,最向前兼容的解决方案是从头开始使用结构,以后可以根据需要轻松扩展w/o破坏兼容性。
struct FoobarizerReturn {
1: list<double> data
// more data to come later
}
service FooBar {
FoobarizerReturn Foobarizer()
}