天天看點

PostgreSQL 高并發任務配置設定系統 實踐

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來提高并發,降低等待。