PostgreSQL , 高并發消費 , pg_try_advisory_xact_lock , 秒殺 , 任務配置設定
給任務配置設定線程ID,或讓線程去搶占任務執行,是任務配置設定系統中的基本需求。
目的是能夠快速的消耗掉所有的任務,同又要保證兩點:
1、所有任務都被領取。
2、每個任務隻能被一個線程領取。
3、每個線程同一時間隻能領取一個任務。
實際上在資料庫中, 就是一個高并發的,實時更新系統,設計時要盡量避免沖突,提高處理吞吐。
PostgreSQL的UDF,advisory lock是一個很好的功能點,可以實作高并發、高可靠的任務配置設定。
其中,秒殺例子:
<a href="https://github.com/digoal/blog/blob/master/201711/20171107_31.md">《HTAP資料庫 PostgreSQL 場景與性能測試之 30 - (OLTP) 秒殺 - 高并發單點更新》</a>
功能描述:
有1000個java線程/程序,需要為具體的某個任務選舉出一個master,并把選舉結果寫入到table中,記錄任務ID與master線程/線程ID。
或者說:1每個任務的選舉都被投票一次;2每個任務都隻有一個master。
如果某個線程已經是某個任務的master,那這個線程/程序不參與選舉。
1、JAVA線程與任務ID對應關系表
2、插入1000個線程ID
3、輸入任務ID,傳回JAVA線程ID,表示這個任務配置設定給某個JAVA線程ID。
釋放TID
4、壓測
5、壓測結果
在一個table中,每一行記錄了一個任務,需要把每個任務配置設定一個java執行線程/程序。
總的線程數/程序數多于任務數,并要求在table中記錄目前任務配置設定到的線程/程序ID。
或者說,是多個java線程/程序需要争搶一個任務,需要某個方式實作: 1每個任務都被争搶到;2每個任務隻被一個java線程/程序争搶到。
10萬任務(已知)
100萬線程(ID未知)
1、建表
2、插入10萬任務ID
3、輸入JAVA線程ID,傳回任務ID。表示這個任務配置設定給某個JAVA線程ID。
5、壓測結果,約6秒配置設定完10萬任務。
如果任務ID和JAVA 線程ID都不是預先生成的,那麼同樣可以使用類似的功能點提高并發和可靠性。
使用pg_try_advisory_xact_lock來提高并發,降低等待。