activiti5解決分佈式集羣部署的主鍵問題

1、概要綜述 html

一、activiti5是jbpm4升級上來的一款最新版工做流引擎,已經將本身的表劃分爲4類:運行時、通用數據、歷史數據、流程相關數據,可是 有一個核心問題就是是否支持集羣部署,通過我對源碼的初步分析發現,他的默認主鍵策略是全局獲取一個通用表中的字段來作增長,在大併發量的狀況下會出現主 鍵重複的問題 java

二、activiti5的默認主鍵策略分析: 算法

(1)、每次須要主鍵的時候從act_ge_property表中的next.dbid中獲取下一個主鍵值,可是主鍵增加步長是100,也就是說每次從這裏獲取下一個值的時候,上次是100,下次的值是200. spring

(2)、他們全部須要主鍵的表都從這個表中獲取下一個值 數據庫

(3)、可是他們針對性能作了一個取巧處理,就是每次步長100,將這個步長cache在本地用sychronize方法調用,也就是說一段時間內只須要在本地獲取主鍵便可,不須要訪問數據實時更新,必定程度的緩解了數據庫調用壓力 tomcat

(4)、可是對於高併發來講,這個只能局部緩解,併發寫入壓力,仍是有形成主鍵重複的機率 併發

三、解決方案分析 app

(1)、由於activiti的主鍵是統一管理,直接經過集中替換主鍵策略就能夠完成主鍵策略的替換 高併發

(2)、通過分析源碼發現activiti的流程引擎的主鍵引用採用的方式是先看spring配置的 idGenerator 屬性是否有外部注入,若是沒有,才使用默認的主鍵策略生成主鍵,因此咱們只須要針對配置文件進行主鍵策略的替換便可 性能

(3)、尋找一種能產生惟一主鍵的生成策略,這裏uuid多是一個比較通用的解決方案,不過悲劇的是uuid對於人去識別可能不是很友好,可是對於程序來講無所謂了,而activiti自己的id字段也支持uuid算法來生成主鍵。


2、實施方案

爲了快速見效,直接用activiti官方提供的activiti-explorer項目來更換主鍵策略來驗證效果

一、直接找到部署的war包,更新它的配置文件,來指定主鍵策略。這裏咱們要找的就是那個applicationContext.xml文件

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfigurat
ion">
  	<property name="dataSource" ref="dataSource" />
  	<property name="transactionManager" ref="transactionManager" />
  	<property name="databaseSchemaUpdate" value="true" />
  	<property name="jobExecutorActivate" value="true" />
    <property name="customFormTypes">
      <list>
        <ref bean="userFormType"/>
      </list>
    </property>  <property name="idGenerator"><bean class="org.activiti.engine.impl.persiste
nce.StrongUuidGenerator" /></property> </bean>

二、將主鍵策略要引用的uuid這個jar包引入,這裏我使用java-uuid-generator-3.1.2.jar

 

三、從新啓動tomcat來作相關流程部署,發現數據庫中的主鍵策略真的變爲uuid了(這裏別忘記先清理庫啊,這樣看起來效果纔不會被幹擾,由於之前一直用的是默認主鍵生成策略,生成的int類型的主鍵)

相關文章
相關標籤/搜索