代码之家  ›  专栏  ›  技术社区  ›  Chacha

Thrift IDL:服务响应为列表

  •  3
  • Chacha  · 技术社区  · 7 年前

    在thrift IDL中,服务响应也可以是列表或映射吗?

    另外,我可以从哪里验证来源是什么?还请提及来源。

    1 回复  |  直到 7 年前
        1
  •  3
  •   JensG    7 年前

    当然可以:

    service FooBar {
        list<double>  Foobarizer()
    }
    

    完全合法。

    那么为什么人们要使用struct呢?嗯,它使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()
    }