回答一些你們疑惑的地方!mysql
答:Hmily是採用AOP切面的方式與你的RPC方法綁定,無非就是在你RPC調用的時候,保存了日誌(經過異步disruptor),傳遞了一些參數。如今confrim,cancel也都爲異步的調用,所以其性能與你的rpc性能同樣。記住Hmily不生產事務,Hmily只是分佈式事務的搬運工。以前Hmily在AOP切面加了一把鎖,致使了性能降低,也就是Spring cloud 中國社區作的那篇文章。如今已經所有修復,而且所有異步化。其實那麼測試時不合理的,由於是壓測的demo,都是默認的配置。下文我會講解,怎麼樣才能提升Hmiy性能。git
答: 咱們支持在分佈式環境中調用一個RPC方法,若是超時了。好比dubbo設置的超時時間是100ms,可能你的方法用了140ms,可是你的方法是執行成功了的。可是對調用方來講,你是失敗的。這個時候須要回滾。因此Hmily的作法是。調用者認爲你是失敗的,不會將加入的回滾調用鏈條中。所以超時的rpc接口方,進行自身的回滾。會有一個定時任務來進行回滾,由於日誌狀態是try階段,會調用cancel方法進行回滾,從而到達最終一致性!github
答:Hmily是和你的應用AOP切面綁定在一塊兒的,自然支持集羣。集羣環境中定時恢復問題,其實幾乎沒有,除非你的集羣同時一下掛掉,纔會有這個問題。當你集羣同時掛掉,在恢復的時候,日誌會有一個version字段,更新成功的,纔會去進行恢復。redis
答:這種想法的,確定是沒看源碼,或者是看了沒怎麼看懂。在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&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>
複製代碼
<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>
複製代碼
<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>
複製代碼
<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>
複製代碼