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文件
二、將主鍵策略要引用的uuid這個jar包引入,這裏我使用java-uuid-generator-3.1.2.jar
三、從新啓動tomcat來作相關流程部署,發現數據庫中的主鍵策略真的變爲uuid了(這裏別忘記先清理庫啊,這樣看起來效果纔不會被幹擾,由於之前一直用的是默認主鍵生成策略,生成的int類型的主鍵)