Hmily: 輕鬆搞定高併發分佈式事務

Hmily高併發事務處理

回答一些你們疑惑的地方!mysql

1. Hmily的性能問題?

答:Hmily是採用AOP切面的方式與你的RPC方法綁定,無非就是在你RPC調用的時候,保存了日誌(經過異步disruptor),傳遞了一些參數。如今confrim,cancel也都爲異步的調用,所以其性能與你的rpc性能同樣。記住Hmily不生產事務,Hmily只是分佈式事務的搬運工。以前Hmily在AOP切面加了一把鎖,致使了性能降低,也就是Spring cloud 中國社區作的那篇文章。如今已經所有修復,而且所有異步化。其實那麼測試時不合理的,由於是壓測的demo,都是默認的配置。下文我會講解,怎麼樣才能提升Hmiy性能。git

2. 關於RPC調用超時Hmily是怎麼處理的?

答: 咱們支持在分佈式環境中調用一個RPC方法,若是超時了。好比dubbo設置的超時時間是100ms,可能你的方法用了140ms,可是你的方法是執行成功了的。可是對調用方來講,你是失敗的。這個時候須要回滾。因此Hmily的作法是。調用者認爲你是失敗的,不會將加入的回滾調用鏈條中。所以超時的rpc接口方,進行自身的回滾。會有一個定時任務來進行回滾,由於日誌狀態是try階段,會調用cancel方法進行回滾,從而到達最終一致性!github

3.Hmily支持集羣部署的問題?以及集羣環境中,定時任務日誌恢復的問題?

答:Hmily是和你的應用AOP切面綁定在一塊兒的,自然支持集羣。集羣環境中定時恢復問題,其實幾乎沒有,除非你的集羣同時一下掛掉,纔會有這個問題。當你集羣同時掛掉,在恢復的時候,日誌會有一個version字段,更新成功的,纔會去進行恢復。redis

4.Hmily是異步保存日誌的,那麼很極端狀況下(代碼恰好執行到這一行,而後jvm退出,斷電啦什麼的),日誌還沒保存那怎麼處理呢?

答:這種想法的,確定是沒看源碼,或者是看了沒怎麼看懂。在AOP切面中,會先進行日誌的異步保存,注意狀態是PRE_TRY。在try執行完成後,更新爲try。就算存在可能你說的什麼斷電,什麼你在打斷電調試,而後kill服務之類的。(Mysql我均可以讓他事務失效,你信不信?)我只能說,不要花大力氣去解決那些偶然的事情,最好的解決辦法是不解決它。 Hmily針對高併發時候的參數配置調優。 可能這部門內容針對熟悉Hmily的人來講,不熟悉的也不要緊。直接上github上看相關文檔就好。 hmily支持Spring bean xml 方式的配置,同時也支持spring boot start yml方式的配置。spring

<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>jdksql

  • recoverDelayTime :定時任務延遲時間(單位是秒,默認120。這個參數只是要大於你的rpc調用的超時時間設置。mongodb

  • retryMax : 最大重複次數,默認3次。當你的服務down機,定時任務會執行retryMax次數去執行你的cancel仍是confrim。數據庫

  • bufferSize: disruptor的bufferSize,當高併發的時候,能夠調大。注意是 2n次方bootstrap

  • consumerThreads distuptor消費線程數量,高併發的時候,能夠調大。markdown

  • started: 注意在是發起方的時候,把此屬性設置爲true。參與方爲false。

  • asyncThreads 異步執行confirm和cancel線程池線程的大小,高併發的時候請調大

  • 接下來是最重要的事務日誌的存儲 在咱們的壓測中,推薦使用mongo。表現爲 mongodb>redis集羣>mysql>zookeeper

  • 若是你採用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>
    複製代碼
    • 若是你採用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>
複製代碼
  • 若是你採用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>
複製代碼
  • 數據庫的配置在上面已經有了,使用file方式的存儲我就不介紹了.
  • 以上就是今天分享的內容,一個註解,幾行配置輕輕鬆鬆搞定高併發分佈式事務!
相關文章
相關標籤/搜索