MongoDB changeStream 的 PHP 實現

ifelse發表於2020-06-22

什麼是mongodb的changeStream

  • changeStream是mongodb基於oplog(操作日誌)的實時的資料變更流,應用程式可以透過changeStream實現對mongo資料變更的訂閱,我們可以理解為MySQL中的觸發器或者基於binlog複製的從節點。

如何使用

  • changeSteam可以對某個db/colletion/deployment進行監聽(watch)
  • 監聽的事件(event)包括insert Event、Update Event、Replace Event、 delete Event等事件

使用場景

  • 可以利用這個特性實現對mongo中資料變更的監聽,進行資料同步、複製等操作,舉個例子,公司原始系統使用PHP+MySQL進行服務,後續經過發展,賬號服務越來越複雜,賬號屬性多變,資料儲存切換至MongoDB,採用Java進行新服務提供,但是老系統又不能一時砍掉,砍掉我們就要丟飯碗了,那資料流從mongo到MySQL如何進行同步呢,一個方式就是可以利用changeStream 進行。

程式碼實現

  • 這裡我透過一個簡單的demo來學習changeStream

  • 前提準備

  • 安裝MongoDB

  • mongodb需要開啟複製集,也就是必須要主從,部分版本需要開啟 enableMajorityReadConcern: true

  • 安裝PHPmongdoDB擴充套件,注意事項mongodb擴充套件而不是mongo

  • composer 安裝php-mongodb包

實現 具體實現後面貼圖

  • 配置mongodb的複製集, mongo.conf 在程式碼例項中,這裡我們使用一主兩從
  • 啟動 mongod -f /Users/gaoz/project13/mongo/db1/mongod.conf
  • 啟動監聽客戶端 php index.php
  • 透過mongoshell進行資料insert/update操作

注意事項

  • 在實際的使用過程中,要注意資料丟失的情況
  • 考慮大量資料變更的發生,加入Mq中介軟體進行訊息處理
  • 做好服務故障監聽

啟動mongod服務,這裡建立三個/mongo/db 分別為db1, db2, db3, 埠分別為28017,28018,28019

啟動mongo監聽指令碼

透過mongoshell 運算元據

更新資料

監聽指令碼接受到資料變更

看一下接受到資料

這裡重點關注三個內容

  • operationType: 操作型別,可能是update、insert、replace等
  • fullDocument: 文件內容
  • 如果是更新的話,updateFields則是變更內容

後續的使用,比如同步到MySQL,大家可以在監聽指令碼中加入同步邏輯即可。

參考資料

參考程式碼

個人學習使用,歡迎指正討論。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章