技术问题分析-报文截断02(11.21)

栏目: 编程工具 · 发布时间: 5年前

今天继续分析下Oracle OSB总线代理后发布的Web Service服务,在客户端消费的时候出现ESB系统级的异常,具体的异常错误信息为:

OSB-382030:Failure while un-marshalling message: Failed to parse XML text

该问题继续排查了一整天,但是仍然没有得到确切的原因。今天的进展如下:

发现出现异常的消费端均没有采用Http Chunked编码模式,这个时候Server端在获取完整数据的时候,需要和http-header中传递的Content-Length做比较,如果长度不一致也会抛出异常。在前面我们分析了当前的Post Timeout设置为2分钟,即在2分钟内如果还没有获取到完整的报文信息,那么就会出现Post Timeout的超时错误。而根据实际的日志排查,基本分析为:

OSB在接收消息请求的时候,在2分钟没有接收到完整的消息,导致出现Post TimeOut,而这个时候未完整的消息流传递给Proxy代理服务的时候,由于XML报文不完整,导致报出parse XML text的错误。

同时在设置Http的设置中,除了Post Timeout,还有一个Duration持续时间的设置(关闭不活动的http连接需要等待的时间),当前时间设置为30秒,是否该值也需要调整到120秒?这个是一个疑问点。

可以想到的后续进一步解决思路有

1. 对于出现问题的消费端,修改为启用Http Chunked编码模式方式。

2. 修改Duration持续时间的设置

这两个都是可以尝试去分析和解决的方向。

其次,今天我们进一步抓取了OSB Server上的日志信息,对于osb server本身的日志并没有太多的异常记录。但是我们在观察access.log日志的时候发现,在OSB Server上可能只产生了5个服务调用实例,但是在access.log文件里面却有多条Post记录,而每条记录本身都只Post传输了一部分数据,基本在1k左右。其中大量的Post都是在1059byte,初步分析应该是一次接口服务调用对于消息数据的传递分为多次Post进行,每次post只是传输了一部分数据。

而最后需要Server端对所有数据进行汇总后形成完整的报文信息再去调用代理服务。

那么为什么消费端会产生如此多次的Post调用记录?而其它消费方系统却没有这个现象,经过分析,出现问题的两个消费方系统均采用了 Docker 容器进行部署,分配的是动态IP信息,是否存在可能每次Post过来的数据本身也分散到多个节点在传输?

如果这个假设成立的话,那么完全就有可能是一次完整的Post操作被负载均衡到多个OSB Server节点上,从而导致了报文信息不全。因为当前我们的的负载均衡策略是完全轮询,不保持会话,对于非Docker部署的时候不会出现问题,但是在Docker动态容器化部署的时候则出现问题。

因此可以进一步验证的是将集群修改为Session会话保持后,是否还存在一样的问题。


以上所述就是小编给大家介绍的《技术问题分析-报文截断02(11.21)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

游戏之旅

游戏之旅

云风 / 电子工业出版社 / 2005-12-01 / 46.00

这是一本非常有特色的计算机编程学习书籍。其特色就在于它将作者十余年来对游戏编程的所思、所感、所悟与编程理论知识相结合,褪去了纯理论的教学理念,使读者在前人的学习过程中吸取学习经验和教训,将计算机基础知识和高级编程技术不知不觉地融入自己的头脑中。 本书忠实地记录了作者十余年来对游戏编程的所思、所感、所悟。全书按照作者本人学习和实践的过程,带着读者从基础的计算机知识到高级的编程技......一起来看看 《游戏之旅》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具