Thrift更新最佳实践

之前仅仅知道用thrift,下午没事讨论到了thrift在更新idl的时候注意事项,补一补知识。

转载:
https://blog.csdn.net/hbuxiaoshe/article/details/22106065

关于thrift字段修改的问题,实验证明:

1,使用optional字段,不用判断是否设置。如果没有设置,内容为0(int)或者空(string)。

2,optional字段设置时,只能用__set_xx()赋值,否则无效。

3,required字段设置时,可以直接=赋值,也可以__set_xx()赋值。

4,更改字段的名字后,发送端更新,而接收端不更新,照样接收成功。只会带来编译问题。

5,更改字段的类型,如果该字段为optional,接收端其他字段照样接收,只是该字段的值为空(或0)。
如果该字段为required,接收端接收错误:无效数据格式(Invalid data)。
TProtocolException: Invalid data

6,末尾添加字段(不在末尾添加字段,相当于字段改名和修改类型)
optional和required都不会出错。此时发送端和接收端最好都更新,否则没有意义。

7,字段先后顺序可以改变,但字段前面对应的号不能改变,否则Invalid data。
顺序改变后,数字不是递增的,看来不爽。

8,删除字段(不管是中间的字段,还是末尾的字段)
如果删除的字段是required,则Invalid data,如果是optional,正常。

9,如果修改的字段是optional的另一个结构体,如果该字段不设置,任何修改都不会出错。一旦设置,就需要解析该结构体,解析出错
接收端显示:Invalid data
发送端显示:No more data to read.

10,假设存在这样的数据流,数据a由A发送给B,经过B处理后发送给C。如果数据a增加optional字段后,重新编译A和C,C接收到的数据a中新添加字段无效。如果再重新编译B,C接收到的数据该字段正常。可能原因:未编译的B由于不识别新加字段,所以解析时丢弃,发送给C的数据就缺失该字段。

你可能感兴趣的:(Thrift更新最佳实践)