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()
}