`

thrift使用出现诡异问题

 
阅读更多

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吧

多沟通,闭门造车也许可能,但绝对浪费时间

同时让我们继续纠结吧。。。。

分享到:
评论
1 楼 xushenkun4 2014-03-04  
至今仍然有这个bug,0.9.1
无法传输中文utf8。

相关推荐

Global site tag (gtag.js) - Google Analytics