Hmily:轻轻松松搞定高并发分布式事务

点击上方“芋道源码”,选择“置顶公众号”

技术文章第一时间送达!

源码精品专栏

 

来源:http://t.cn/E2bybbm

回答一下 社区的一些问题,和大家一些疑惑的地方!Hmily针对高并发时候的参数配置调优。小结


目前 Hmily、SkyWalking、Sharding-Sphere 正在参加《2018 年最受欢迎中国开源软件》,辛苦大家打开 https://www.oschina.net/project/top_cn_2018?sort=1 ,然后分别搜索「Hmilly」「SkyWalking」「Sharding-Sphere」进行投票。感谢艿分。???

欢迎大家关注,或者提交pr,让Hmily变的更好,更完美

 gitHub: [https://github.com/yu199195/hmily]
 gitee [https://gitee.com/shuaiqiyu/hmily]

接下来回答一下 社区的一些问题,和大家一些疑惑的地方!

1. Hmily的性能问题?

答:Hmily是采用AOP切面的方式与你的RPC方法绑定,无非就是在你RPC调用的时候,保存了日志(通过异步disruptor),传递了一些参数。现在confrim,cancel也都为异步的调用,因此其性能与你的rpc性能一样。记住Hmily不生产事务,Hmily只是分布式事务的搬运工。之前Hmily在AOP切面加了一把锁,导致了性能下降,也就是Spring cloud 中国社区做的那篇文章。现在已经全部修复,并且全部异步化。其实那么测试时不合理的,因为是压测的demo,都是默认的配置。下文我会讲解,怎么样才能提高Hmiy性能。

2. 关于RPC调用超时Hmily是怎么处理的?

答: 我们支持在分布式环境中调用一个RPC方法,如果超时了。比如dubbo设置的超时时间是100ms,可能你的方法用了140ms,但是你的方法是执行成功了的。但是对调用方来说,你是失败的。这个时候需要回滚。所以Hmily的做法是。调用者认为你是失败的,不会将加入的回滚调用链条中。因此超时的rpc接口方,进行自身的回滚。会有一个定时任务来进行回滚,因为日志状态是try阶段,会调用cancel方法进行回滚,从而到达最终一致性!

3. Hmily支持集群部署的问题?以及集群环境中,定时任务日志恢复的问题?

答:Hmily是和你的应用AOP切面绑定在一起的,天然支持集群。集群环境中定时恢复问题,其实几乎没有,除非你的集群同时一下挂掉,才会有这个问题。当你集群同时挂掉,在恢复的时候,日志会有一个version字段,更新成功的,才会去进行恢复。

4. Hmily是异步保存日志的,那么很极端情况下(代码刚好执行到这一行,然后jvm退出,断电啦什么的),日志还没保存那怎么处理呢?

答:这种想法的,肯定是没看源码,或者是看了没怎么看懂。在AOP切面中,会先进行日志的异步保存,注意状态是PRE_TRY。在try执行完成后,更新为try。就算存在可能你说的什么断电,什么你在打断电调试,然后kill服务之类的。(Mysql我都可以让他事务失效,你信不信?)我只能说,不要花大力气去解决那些偶然的事情,最好的解决办法是不解决它。

Hmily针对高并发时候的参数配置调优。

可能这部门内容针对熟悉Hmily的人来说,不熟悉的也没关系。直接上github上看相关文档就好。

  • hmily支持Spring bean xml 方式的配置,同时也支持spring boot start yml方式的配置。

 <bean id="hmilyTransactionBootstrap" class="com.hmily.tcc.core.bootstrap.HmilyTransactionBootstrap">
        <property name="serializer" value="kryo"/>
        <property name="recoverDelayTime" value="120"/>
        <property name="retryMax" value="3"/>
        <property name="loadFactor" value="2"/>
        <property name="scheduledDelay" value="120"/>
        <property name="scheduledThreadMax" value="4"/>
        <property name="bufferSize" value="4096"/>
        <property name="consumerThreads" value="32"/>
        <property name="started" value="false"/>
        <property name="asyncThreads" value="32"/>
        <property name="repositorySupport" value="db"/>
        <property name="tccDbConfig">
            <bean class="com.hmily.tcc.common.config.TccDbConfig">
                <property name="url"
                          value="jdbc:mysql://192.168.1.98:3306/tcc?useUnicode=true&amp;characterEncoding=utf8"/>

                <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </bean>
        </property>
    </bean>

serializer :这里我推荐使用是kroy。当然hmily也支持hessian,protostuff,jdk。在我们测试中表现为:
 kroy>hessian>protostuff>jdk

recoverDelayTime :定时任务延迟时间(单位是秒,默认120。这个参数只是要大于你的rpc调用的超时时间设置。

retryMax : 最大重复次数,默认3次。当你的服务down机,定时任务会执行retryMax次数去执行你的cancel还是confrim。

bufferSize: disruptor的bufferSize,当高并发的时候,可以调大。注意是 2n

consumerThreads distuptor消费线程数量,高并发的时候,可以调大。

started: 注意在是发起方的时候,把此属性设置为true。参与方为false。

asyncThreads 异步执行confirm和cancel线程池线程的大小,高并发的时候请调大

接下来是最重要的事务日志的存储 在我们的压测中,推荐使用mongo。表现为 mongodb>redis集群>mysql>zookeeper

1. 如果你采用mongodb存储日志,配置如下(url可以配置成mongdb集群的url)

       <property name="repositorySupport" value="mongodb"/>
        <property name="tccMongoConfig">
            <bean class="com.hmily.tcc.common.config.TccMongoConfig">
                <property name="mongoDbUrl"  value="192.168.1.68:27017"/>
                <property name="mongoDbName" value="happylife"/>
                <property name="mongoUserName" value="xiaoyu"/>
                <property name="mongoUserPwd" value="123456"/>
            </bean>
        </property>

2. 如果你采用redis存储日志,配置如下:

  • redis单节点

     <property name="repositorySupport" value="redis" />
      <property name="tccRedisConfig">
          <bean class="com.hmily.tcc.common.config.TccRedisConfig">
              <property name="hostName"
                        value="192.168.1.68"/>

              <property name="port" value="6379"/>
              <property name="password" value=""/>
          </bean>
      </property>
  • redis哨兵模式集群:

     <property name="repositorySupport" value="redis"/>
      <property name="tccRedisConfig">
          <bean class="com.hmily.tcc.common.config.TccRedisConfig">
              <property name="masterName" value="aaa"/>
              <property name="sentinel" value="true"/>
              <property name="sentinelUrl" value="192.168.1.91:26379;192.168.1.92:26379;192.168.1.93:26379"/>
              <property name="password" value="123456"/>
          </bean>
      </property>
  • redis集群:

     <property name="repositorySupport" value="redis"/>
      <property name="tccRedisConfig">
          <bean class="com.hmily.tcc.common.config.TccRedisConfig">
              <property name="cluster" value="true"/>
              <property name="clusterUrl" value="192.168.1.91:26379;192.168.1.92:26379;192.168.1.93:26379"/>
              <property name="password" value="123456"/>
          </bean>
      </property>

3. 如果你采用zookeeper存储日志,配置如下:

        <property name="repositorySupport" value="zookeeper"/>
        <property name="tccZookeeperConfig">
            <bean class="om.hmily.tcc.common.config.TccZookeeperConfig">
                <property name="host"  value="192.168.1.73:2181"/>
                <property name="sessionTimeOut" value="100000"/>
                <property name="rootPath" value="/tcc"/>
            </bean>
        </property>

4. 数据库的配置在上面已经有了,使用file方式的存储我就不介绍了.

小结

以上就是今天分享的内容,一个注解,几行配置轻轻松松搞定高并发分布式事务!




欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

640

已在知识星球更新源码解析如下:

  • 《精尽 Dubbo 源码解析系列》69 篇。

  • 《精尽 Netty 源码解析系列》61 篇。

  • 《精尽 Spring 源码解析系列》35 篇。

  • 《精尽 MyBatis 源码解析系列》34 篇。

  • 《数据库实体设计》17 篇。

  • 正在准备更新《精尽 Spring MVC 源码解析系列》


目前在知识星球更新了《Dubbo 源码解析》目录如下:

01. 调试环境搭建
02. 项目结构一览
03. 配置 Configuration
04. 核心流程一览

05. 拓展机制 SPI

06. 线程池

07. 服务暴露 Export

08. 服务引用 Refer

09. 注册中心 Registry

10. 动态编译 Compile

11. 动态代理 Proxy

12. 服务调用 Invoke

13. 调用特性 

14. 过滤器 Filter

15. NIO 服务器

16. P2P 服务器

17. HTTP 服务器

18. 序列化 Serialization

19. 集群容错 Cluster

20. 优雅停机

21. 日志适配

22. 状态检查

23. 监控中心 Monitor

24. 管理中心 Admin

25. 运维命令 QOS

26. 链路追踪 Tracing

... 一共 69+ 篇

目前在知识星球更新了《Netty 源码解析》目录如下:

01. 调试环境搭建
02. NIO 基础
03. Netty 简介
04. 启动 Bootstrap

05. 事件轮询 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 字节缓冲区 ByteBuf

09. 通道处理器 ChannelHandler

10. 编解码 Codec

11. 工具类 Util

... 一共 61+ 篇


目前在知识星球更新了《数据库实体设计》目录如下:


01. 商品模块
02. 交易模块
03. 营销模块
04. 公用模块

... 一共 17+ 篇


目前在知识星球更新了《Spring 源码解析》目录如下:


01. 调试环境搭建
02. IoC Resource 定位
03. IoC BeanDefinition 载入

04. IoC BeanDefinition 注册

05. IoC Bean 获取

06. IoC Bean 生命周期

... 一共 35+ 篇


目前在知识星球更新了《MyBatis 源码解析》目录如下:


01. 调试环境搭建
02. 项目结构一览
03. MyBatis 面试题合集

04. MyBatis 学习资料合集

05. MyBatis 初始化

06. SQL 初始化

07. SQL 执行

08. 插件体系

09. Spring 集成

... 一共 34+ 篇

1、课程简介Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。       在本套课程中,我们将全面的讲解Spring Cloud技术栈, 从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用Spring Cloud如何解决实际的问题。Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构。- 注册中心负责服务的注册与发现,很好将各服务连接起来- 断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。- API网关负责转发所有对外的请求和服务- 配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息- 链路追踪技术可以将所有的请求数据记录下来,方便我们进行后续分析- 各个组件又提供了功能完善的dashboard监控平台,可以方便的监控各组件的运行状况2、适应人群有一定的Java基础,并且要有一定的web开发基础。3、课程亮点       系统的学习Spring Cloud技术栈,由浅入深的讲解微服务技术。涵盖了基础知识,原理剖析,组件使用,源码分析,优劣分析,替换方案等,以案例的形式讲解微服务中的种种问题和解决方案l  微服务的基础知识n  软件架构的发展史n  微服务的核心知识(CAP,RPC等)l  注册中心n  Eureka搭建配置服务注册n  Eureka服务端高可用集群n  Eureka的原理和源码导读n  Eureka替换方案Consuln  Consul下载安装&服务注册&高可用l  服务发现与服务调用n  Ribbon负载均衡基本使用&源码分析n  Feign的使用与源码分析n  Hystrix熔断(雪崩效应,Hystrix使用与原理分析)n  Hystrix替换方案Sentinell  微服务网关n  Zuul网关使用&原理分析&源码分析n  Zuul 1.x 版本的不足与替换方案n  SpringCloud Gateway深入剖析l  链路追踪n  链路追踪的基础知识n  Sleuth的介绍与使用n  Sleuth与Zipkin的整合开发l  配置中心n  SpringClond Config与bus 开发配置中心n  开源配置中心Apollo4、主讲内容章节一:1.     微服务基础知识2.     SpringCloud概述3.     服务注册中心Eureka4.     Eureka的替换方案Consul章节二:1.     Ribbon实现客户端负载均衡2.     基于Feign的微服务调用3.     微服务熔断技术Hystrix4.     Hystrix的替换方案Sentinel章节三:1.     微服务网关Zuul的基本使用2.     Zuul1.x 版本的不足和替换方案3.     深入SpringCloud Gateway4.     链路追踪Sleuth与Zipkin章节四:1.     SpringCloud Config的使用2.     SpringCloud Config结合SpringCloud Bus完成动态配置更新3.     开源配置中心Apollo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值