1. 发现问题
a.问题
在使用thrift接口时出现丢失数据问题,输出对象正常是输出user和device信息,但是两种只能输出其中一个,出现丢失数据问题。
b. 应用环境
thrift 0.8.0
python 2.6.5
c.接口使用协议
TTransport.TBufferedTransportFactory
TCompactProtocol.TCompactProtocolFactory
2.找问题
a.确定服务器端已经写了数据user和device
b.客户端始终读取不到数据
c.更换其他版本thrift的py client ,还是不行
d.在同事那里找了一个thrift_py 0.6的自定义修改版本,问题解决
当前采用:
TTransport.TFramedTransportFactory
TCompactProtocol.TBinaryProtocolFactory
处理了中文问题
e.在该py客户端下当修改为:
TTransport.TBufferedTransportFactory
TCompactProtocol.TCompactProtocolFactory
继续有问题,不调用服务报错
go on协议修改为:
TTransport.TBufferedTransportFactory
TCompactProtocol.TBinaryProtocolFactory
ok没有问题,纠结啊
f.再替换使用thrift 0.8.0的client
使用
TTransport.TBufferedTransportFactory
TCompactProtocol.TBinaryProtocolFactory
和
TTransport.TBufferedTransportFactory
TCompactProtocol.TCompactProtocolFactory
继续丢数据
修改thrift 0.8.0的client可处理中文后
TTransport.TBufferedTransportFactory
TCompactProtocol.TCompactProtocolFactory
继续丢数据
TTransport.TBufferedTransportFactory
TCompactProtocol.TBinaryProtocolFactory
和
TTransport.TFramedTransportFactory
TCompactProtocol.TBinaryProtocolFactory
ok,没有问题都能正常使用
3.解决方法
修改TBinaryProtocol.py
line 121 writeString方法:
def writeString(self, str):
if type(str) is unicode:
str = str.encode('utf-8')
self.writeI32(len(str))
self.trans.write(str)
thrift协议修改为:
TTransport.TBufferedTransportFactory
TCompactProtocol.TBinaryProtocolFactory
运行成功!
4. 总结
thrift赶紧修改bug吧
多沟通,闭门造车也许可能,但绝对浪费时间
同时让我们继续纠结吧。。。。