天天看點

PostgreSQL 物聯網黑科技 - 閱後即焚

在物聯網應用場景中,有大量的傳感器,會産生非常大量的消息以極高的并發進入資料庫。

這些資料如果直接進入面向olap場景設計的資料倉庫,資料實時入庫會成為瓶頸,并且olap系統很難接受非常高并發的請求。

面對這樣的應用場景,這些既要又要還要怎麼滿足呢?

.1. 既要實時入庫,

.2. 又要實時分析,

.3. 還要曆史留檔,應對随時變化的分析需求。

實時入庫比較容易滿足,我前些天寫過一篇 "postgresql 如何潇灑的處理每天上百tb的資料增量"

<a href="https://yq.aliyun.com/articles/8528">https://yq.aliyun.com/articles/8528</a>

實時分析也比較好滿足,我前些天寫過一篇 "postgresql "物聯網"應用 - 1 實時流式資料處理案例(萬億每天)"

<a href="https://yq.aliyun.com/articles/166">https://yq.aliyun.com/articles/166</a>

曆史留檔,應對随時變化的分析需求。這一點的需求其實也非常簡單,其實就是在滿足了前面兩點後,把資料load到olap系統。

但是不要小看這個非常簡單的操作,做到實時性,一緻性是非常關鍵的。

一般的做法存在的gap問題(一緻性問題)

gap問題可解,例如通過快照或者單線程來解,太low了。

以前寫過關于解gap問題的一系列文章:

gap問題出現的原因,用一張圖來表示:

PostgreSQL 物聯網黑科技 - 閱後即焚

簡單來說,就是讀取資料的事務快照把一些未送出,但是序列或時間靠前的記錄屏蔽了。下次再讀取時就會産生gap,實時性越高,産生gap的機率越高。有gap,oltp和olap系統的資料就會不一緻。

傳統的解決這個問題的辦法:

.1. 延遲同步,例如同步一個小時前的資料,來減少gap。

.2. 串行插入,資料串行插入,不存在gap。

.3. 在記錄中添加一個xid字段,記錄資料插入的事務号;讀取資料時通過事務快照,記錄未送出的事務xid;下次再次讀取資料時,根據快照中表示未結束事務的xid,以及行上的xid找到這些gap記錄。

不用多說,前面幾種方法,都有一定的弊端。

要解決實時性問題,又要高逼格。

postgresql的閱後即焚完美的解決了以上問題,可以完美的實作并發性,一緻性,實時性。

PostgreSQL 物聯網黑科技 - 閱後即焚

并發指并發的插入和并發的讀取;

一緻性指資料進去n條,出去一定是n條;

實時性,指資料可以實時|流式的取走,不需要設間隔;

閱後即焚的文法很簡單,例子:

閱後即焚:

下面進行并發測試,

驗證一緻性,實時性,并發性:

并發插入2小時:

并發閱後即焚2小時:

驗證插入和閱後即焚的記錄數一緻。

性能名額(64張表并發測試寫入和閱後即焚的性能名額):

插入: 230萬行/s

閱後即焚: 384萬行/s

這種技術在其他應用場景的使用:

.1. 延遲确認,在短信确認的應用中非常常見,如訂閱一個營運商的業務,一般會收到二次确認的短信。

服務端會向資料庫插入一條記錄,然後等待使用者回報,回報後更新之前插入的那條記錄的狀态。

.2. 相關的用法(oracle也支援這種用法) :

擴充閱讀:

"postgresql 如何潇灑的處理每天上百tb的資料增量"

"postgresql "物聯網"應用 - 1 實時流式資料處理案例(萬億每天)"

postgresql的其他特性也非常的适合物聯網:

json支援, gis支援, 視窗查詢, 樹形查詢, 輕資料分析, 範圍類型, 範圍索引 等等。

繼續閱讀