MongoDB changeStream 的 PHP 实现

什么是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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!