实际中碰到的一个异构系统之间数据交换的处理方式设计
来源:互联网 发布:知乎45回答 编辑:程序博客网 时间:2024/05/23 21:47
情况描述:
两个不同的业务系统M系统与E系统,两者之间的数据交换采用ESB平台,从而可以保证ESB内部的数据传递流程可以具有一个全局的事务,一旦发生任何异常,都会回滚。
数据传递的方向为从M系统传递至E系统。
前期约定的内容,ESB获取M系统的数据,数据获取方式为从ESB与M系统约定的数据库中间表中获取(相当于M系统的前置机),调用E系统的WebService,将数据写入E系统,并且将调用是否成功的结果写回与M系统约定的中间表中(写回M系统中间表的工作由ESB负责完成),调用E系统的WS之后,除了回写与M系统的中间表,还会有一些其他的数据库更新等操作。(监控与M系统的中间表的增量数据,使用数据库触发器,并在额外的表中,记录增量数据的信息(例如:新增时间等信息),一切顺利之后,把监控到的与M系统的中间表中的增量数据删除掉。)
问题:
- 事务的问题可以交由ESB来处理,可以忽略。
- 调用WS如果数据未能写入E系统,WS不会抛出异常,而是会返回一个未能写入的代码,并返回原因。
- 调用WS成功,并且成功写入E系统,但是,在后续ESB处理其他事情的过程中发生异常,事务照样回滚。而E系统的WS,没有补偿机制,不会对数据是否已经存在进行判断,而且E系统的WS由于各种原因,调用时性能不佳
解决方案:
对于问题1。无需关注。
对于问题2。由于前期ESB与M系统约定,一旦发生ESB调用E系统的WS未能写入的情况,M系统会重新生成新的数据,而不是对原有数据进行修改。ESB只需将调用E系统的WS的结果返回写入中间表即可,不管任何一方发生异常,均由M系统重新生成数据,重新传递。这样ESB只需监控新增的数据,并按顺序执行相应操作即可。
对于问题3。就需要在调用E系统的WS之前,对E系统中是否存在相应数据进行判断,如果存在,并且同时最近一次调用时返回的结果为正常,则不再重复调用WS,而是直接执行后续操作;如果不存在或者调用时返回的结果不正常,甚至没有返回结果,则重新从头开始执行相应操作。
另外,如果没有与M系统关于调用E系统WS未能写入的情况的约定,则ESB需要根据E系统的WS的返回值进行判断,如果不正常,则可以直接抛出一个异常,从而回滚整个事务(当然,也可以暂时将异常数据暂存至另外的数据库表中或者其他什么位置,防止此问题数据重复出现),保证流程下次可以再次取得此数值。当然,这样也存在一个问题,就是回滚整个事务,与M系统约定的中间表中,就无法取到调用结果是否正常的信息,除非在ESB平台中有一个地方可以查看异常信息及数据,并且有专人来处理此类事情,否则,表面看起来就是ESB停在某条数据那里不动了,会对业务产生影响。
还有一种方案就是由于监控的增量数据都会记录在一个表中,如果发生调用E系统的WS未能写入数据的情况,则不允许ESB将监控到的增量数据删除,并不是抛出异常回滚整个事务,也就能够正常查看到产生错误的原因。
个人认为最后的解决方案是一个比较不错的思路,记录一下以飨自己。
- 实际中碰到的一个异构系统之间数据交换的处理方式设计
- 实际工程中碰到的一个问题
- 数据通信中数据的交换方式小结
- 异构数据源之间交换数据的工具
- SQL中取一个月的数据的处理方式
- 企业之间的数据交换
- 数据库之间的数据交换
- 在.NET中页面之间数据交换的方法
- .net中窗体之间的数据交换总结
- .net中窗体之间的数据交换总结
- .net中窗体之间的数据交换总结
- Flink中task之间的数据交换机制
- 数据通信网的交换方式
- mysql实际使用过程中碰到的一些有…
- C++中两个数据交换的几种实现方式
- linux系统下文件编辑过程中意外退出,再次编辑提示交换文件的处理方式
- 模拟器中模拟交换机时碰到的问题
- sql数据库之间的数据交换
- Linux检测硬盘坏道
- singleTask和singleInstance应该用在ACTION_MAIN且CATEGORY_LAUNCHER的Activity上
- Qt:SQLite 3入门教程
- 基于itext实现的pdf水印
- Hibernate3.3 例子提示: user is not mapped
- 实际中碰到的一个异构系统之间数据交换的处理方式设计
- ffmpg简介以及用它实现音频视频合并(java)
- js例题
- 远距离CAN通讯终端电阻策略
- 应怎样提高外链的质量度?
- plsql回顾(3、debug存储过程或函数 ,函数基本)
- 主页权重合理分配
- 磁盘坏道的检测及修复
- poj3580