【问题标题】:Thrift IDL : service response as listThrift IDL:服务响应作为列表
【发布时间】:2018-04-14 18:03:32
【问题描述】:

在thrift IDL中,服务响应也可以是list还是map?

因为,通常我看到它是一些结构或一些原始类型,如字符串、双精度等。

另外,我可以验证的来源是什么?还请注明出处。

【问题讨论】:

    标签: thrift


    【解决方案1】:

    当然可以:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2011-05-05
      • 2017-02-21
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多