我使用ruby 2.1.2对java服务进行压力测试,如下所示:
(begin thread)
url = "http://service.ops.net/api"
transport = Thrift::HTTPClientTransport.new(url)
protocol = Thrift::CompactProtocol.new(transport)
client = MyService::Client.new(protocol)
transport.open()
client.<somefunctioncall>
(end thread)
...
(join thread)
(exit and begin next pass)
这是通过混合使用有效和半有效参数来调用的。只要我只调用一个端点,这就可以正常工作。如果我通过线程打出&gt;一次1个端点(IE从不同的线程调用两个不同的函数)我开始看到如下的异常:
`read_message_begin&#39;:预期的协议ID -126但得到60(Thrift :: ProtocolException)
我无法找到合理的参考来了解这告诉我的内容。
答案 0 :(得分:1)
消息告诉您数据无法反序列化,因为它们看起来已损坏。但是,这并不意味着它们确实已经损坏。
这种情况的一个非常可能的原因是客户端和服务器不使用完全相同的传输和放大器。协议栈。
产生这种情况的典型错误是在一端使用TFramedTransport
,而另一端则不然。 Thrift Transports可能会在线路上的数据中添加(并期望)额外的数据,尤其是TFramedTransport
通过添加包含帧大小的4字节标头来实现此目的。
值得一提的是,某些服务器类型隐含地希望客户端使用TFramedTransport
。因此,如果您检查了两端并比较了所使用的协议和传输堆栈,这可能是另一个原因。