`
步青龙
  • 浏览: 297734 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

Hessian分布式事务那些破事儿

 
阅读更多

小僧左思右想实在找不到一个妥协的解决Hessian的问题。

假如:一个web应用程序访问的方法调用了四个hessian,简称h1,h2,h3,h4

假设 h1,h2 操作成功,但是由于某些原因(程序bug或者数据库问题,手动错误修改了数据)导致h3 操作失败。

这里的h3操作失败应该让h1,h2两 个操作回滚,并且通知h4 在执行过程中出现了问题(或者直接return) 。后一个过程好解决,让h1,h2回滚怎么办?

hessian没有事务,直接调用hessian也不能用jta,因为hessian和webservice一样都是无状态的。如果是让直接其他操作库的话,JOTM做多库事务同步和回滚,可以做到不管是哪个环节出问题多个事务同时回滚。但是调用hessian或者webservice 直接调用不行,调用的hessian 是在另外一个系统完成的,数据库也可能是不同的数据库,不同的机器,甚至这个hessian的调用操作了几个库,hessian 最多给返回一个值,事务不在客户端!!!

 

小僧只想到一个最搓的方法,应用程序调用XXXAction.aMethod()  一次调用的四个hessian,h1,h2,h3,h4.

其中h1,h2,h3,h4为预提交方法 h11,h21,h31,h41为二次提交方法(不可回滚),当然事务要在全局变量,调用的时候生成,

aMethod 刚开始就在hessian.properties中写一个 XXXAction.aMethod.state=0

然后调用h1,h1在h1中有自己的事务 aMethod要知道h1 的情况,h1 第一阶段提交(预提交)如果成功可以为XXXAction.aMethod.state=y1-    如果是失败就key值为y10- 后面一个0表示失败。

h2,h3,h4相同。aMethod中判断XXXAction.aMethod.state的值为y1-y2-y3-y4-的时候才去调用二次提交方法。否则调用h12,h22,h32,h42 各自的回滚方法。

 

hessian.properties做一个共享 最好是xml存储和解析 根节点是用户名 下面是各个状态值,每次请求的时候如果有了 就清空,没就创建该用户的节点结构。通过NFS 共享此文件,做到一个桥梁作用。

 

发现这样每一个hessian调用要做四件事情 1 写共享文件中每个方法的预提交状态。服务端三个方法:2  第一次提交方法,3 回滚方法, 4第二次提交方法。

 

hessian类似于webservice,例如:做一个处理返回给客户端的时候判断下调用服务端方法时间如果调用时间超过3s 就直接返回y10- 防止一直等待下去。一个操作超过3s等待就不让提交。

 

而事务必须是是全局变量,第一次请求,第二次请求,回滚方法用的事务必须是同一个事务,否则无法完成。

那服务端可以让Transition可以是一个吗? 静态的Transition? 如果Connection 是静态的那服务器也只有死的份了。不能考虑这个了。

 

网上没有找到针对hessian事务的处理,而这位了做到事务又增加了很多的麻烦,那么最妥协的方法也只能是用jta,也必须能对多个库直接操作。而不能只可以调用hessian,这样事务无法控制!

 

颗粒度太细了也会引发一些问题,设计是一个严重的问题,看来读写分离是更好的设计,而不是模块分库。

那么设计应该是写库一个,jta控制,读库N个库,同步到不同的模块库.

1 读写分离

   为什么速写分离会更好?一方面读写的比例很明显,写和读的比例至少也是1:10.而读写都在一起的话,数据库性能明显降低,写的时候数据库表中行会加锁,在MS Server中甚至去锁整个表,那么读就得等待拿得锁,增删改查都在一起的话,主要是因为锁,那么没有锁好不?那数据会脏读,脏写。而读写分离做到了读就用读库,写就在写库,大大将少了因为锁而等待的时间。那么写库会面临日益增多的数据写数据自然的效率自然会慢慢降下来。

   解决:a 写库-历史库 b 读库-多个库

   写库集中写,但是面临数据大的时候未免会导致写的速度降下来,那么弄历史库,一旦表的数据超过了xxx的量就移入历   史库去,分历史库和操作库,历史库可以分年的 分月的。读库根据各个模块进行拆分,可以拆分到很细的模块。

2 web server负载

3 jta-分布式事务。事务可以两阶段提交,如果第二阶段提交出现问题了怎么办?比如预提交成功,真正提交的第一个操作成功,第二个失败,那么真正提交也应该回滚。数据库事务回滚是基于日志的,第二次提交成功了啊,但是其他的操作不在这个库,怎么办?可以用savePoint,在第二阶段提交之前就savePoint,一旦第二阶段提交任何环节出现问题了,就回滚。

从这里也暴漏了我们架构出现的问题,感谢刘总和淘宝架构师给的建议,非常感谢。

savePoint原文连接 

 

分享到:
评论

相关推荐

    分布式事务控制程序代码.rar

    总之,"分布式事务控制程序代码.rar"提供的工具或框架,结合WebServices、RMI和Hessian,旨在简化分布式环境下的服务调用,并通过QDTC这样的事务协调器保证事务的正确性。对于开发小型服务化应用来说,这样的解决...

    TCC分布式事务解决方案.docx

    - **事务日志序列化**:提供了Java、Hessian、Kryo、Protostuff等多种序列化方式的选择。 - **无缝集成Spring**:通过Aspect AOP切面思想与Spring框架无缝结合。 - **集群支持**:天然支持集群部署,提高了系统的...

    用spirng和hessian构建分布式应用(远程接口)的方法

    用Spring和Hessian构建分布式应用(远程接口)的方法 本文主要讲解了如何使用Spring和Hessian构建分布式应用中的远程接口。Hessian是一个轻量级的 RPC 框架,基于 HTTP 协议,可以轻松地实现跨语言的远程调用。...

    java8源码-tcc:TCC分布式事务框架

    TCC分布式事务框架 基于服务层补偿的Tcc分布式事务解决方案,基于java 1.8编写,目前支持springcloud应用框架。 业务层只需把关注点放到资源预留的try方法,业务补偿的confirm/cancel方法的实现上。try成功或者失败...

    Hessian

    Hessian的目标是简化分布式系统之间的通信,通过减少网络传输的数据量来提高性能。与其他基于XML的RPC协议(如SOAP)相比,Hessian更简洁、快速,因为它使用了二进制编码,而非文本格式。 **一、Hessian协议基础** ...

    hessian案例,hessian案例

    Hessian是一种高效的二进制序列化协议,常用于...通过使用Hessian,开发者可以轻松地构建分布式系统,实现服务之间的便捷调用。案例中的文件提供了不同角度的分析和实践指导,帮助我们更好地理解和应用Hessian技术。

    Hessian与spring整合

    当我们谈论“Hessian与Spring整合”时,通常是指将Hessian作为服务通信的机制,结合Spring框架来构建分布式服务系统。这种整合有以下几个关键点: 1. **服务提供者(Service Provider)**:首先,我们需要在服务端...

    hessian框架应用,实现远程调用,分布式开发

    总结,Hessian框架以其高效、简单的特点在分布式开发中占据一席之地。通过`HessianServer`和`HessianClient`,开发者可以快速搭建起服务提供和消费的架构,实现远程调用,简化分布式系统的开发工作。

    dubbo-hessian协议http请求demo(java)

    在IT行业中,分布式服务框架Dubbo是...通过理解Hessian协议的特性,我们可以实现高效、简洁的远程方法调用,提升分布式系统的性能。在实际项目中,可以根据业务需求和安全考虑,灵活调整和优化Hessian协议的使用方式。

    Hessian多个版本打包下载

    这个压缩包包含了Hessian的多个版本,分别是Hessian3.1.6、Hessian3.2.1以及Hessian4.0.7。每个版本都有其特定的功能改进和优化,了解这些版本的区别和适用场景对于开发者来说至关重要。 Hessian3.1.6是Hessian的一...

    hessian

    总结起来,Hessian是一种高效的二进制Web服务协议,它简化了分布式系统中对象的传输,并提供了跨语言的支持。理解和使用Hessian可以帮助我们构建更快速、更灵活的远程服务调用系统。通过深入研究源码和利用相关工具...

    Hessian应用

    1. **分布式服务调用**:通过Hessian,可以实现跨网络的Java对象调用,如同调用本地对象一样方便,极大地降低了分布式服务的开发复杂度。 2. **Web服务**:Hessian可以作为Web服务的底层通信协议,提供比RESTful或...

    Spring中集成Hessian的问题

    在Spring框架中集成Hessian是为了实现远程方法调用(Remote Method Invocation, RMI),这是一种轻量级的序列化协议,可以高效地传输Java...通过深入学习和实践,我们可以更好地利用Hessian来构建高性能的分布式系统。

    多尺度hessian滤波器图像增强

    在图像处理领域,多尺度Hessian滤波器是一种高级的图像增强技术,它主要用于检测图像中的线性结构,特别是对于微弱或者噪声较大的图像特征有很好的识别能力。这个技术是基于数学形态学的Hessian矩阵理论,由V.S. ...

    基于Hessian矩阵增强的心血管分割_hessian_hessian血管_hessian血管分割_血管分割_Hessian矩阵

    在IT领域,尤其是在医学图像分析中,Hessian矩阵是一个重要的数学工具,用于图像特征检测,特别是在血管分割的应用中。本文将深入探讨标题和描述中提到的"基于Hessian矩阵增强的心血管分割"这一主题。 Hessian矩阵...

    hessian服务端 客户端 可运行

    Hessian是一种基于二进制协议的服务,它允许Java应用程序通过HTTP进行远程方法调用(RMI)。这个协议设计的目标是提供轻量级、高效的RPC(Remote ...同时,这也展示了Hessian在实现高效、轻量级的分布式系统中的潜力。

    hessian-4.0.33.jar

    1. 远程服务调用:如分布式系统中的服务间通信。 2. 移动应用通信:移动设备网络环境不稳定,Hessian能有效减少数据传输量。 3. 跨语言通信:Hessian支持多种编程语言,如Java、C++、.NET,实现跨平台的通信。 总结...

    hessianServer

    HessianServer指的是实现Hessian协议的服务端程序,通常用于构建分布式系统,使得不同的应用可以跨网络进行无缝通信。下面将详细介绍Hessian服务端的相关知识点。 1. **Hessian协议**: Hessian是Adobe公司开发的...

    springMVC hessian

    SpringMVC 和 Hessian 是两种在 Java 开发中常见的技术,它们在构建分布式系统时扮演着重要角色。SpringMVC 是 Spring 框架的一部分,主要用于构建 Web 应用的 MVC(模型-视图-控制器)架构。而 Hessian 是一种轻量...

    Hessian 学习 例子 实例

    总的来说,Hessian是一个值得学习的技术,尤其对于那些需要构建高性能、低延迟的分布式系统或者服务间的通信。通过深入理解其原理和实践,你可以更好地利用Hessian来优化你的应用。在提供的链接中,博主otom31分享了...

Global site tag (gtag.js) - Google Analytics