mongo DB change stream

什么是Change Stream

change stream 是MongoDB用于实现变更追踪的解决方案,类似于关系型数据库的触发器,但原理不完全相同:

 change stream触发器
触发方式异步同步(事务保证)
触发位置应用回调事件数据库触发器
触发次数每个订阅事件的客户端1次
故障恢复从上次断点重新触发事务回滚

 

 

 

 

 

 

change stream 实现原理

change stream 是基于oplog实现的。它在oplog上开启一个tailable cursor来追踪所有复制集上的变更操作,最终调用应用中定义的回调函数。被追踪的变更事件主要包括:

  • insert/update/delete

  • drop

  • rename

  • dropDatabase

  • invalidate:drop/rename/dropDatabase将导致invalidate被触发,并关闭change stream

change stream 与可重复读

change stream只推送已经在大多数节点上提交的变更操作,即“可重复读”的变更。这个验证时通过{readConcern:“majority”}实现的,因此:

  • 未开启majority readConcern的集群无法使用change stream。
  • 当集群无法满足readConcern:majority时,change stream不会被触发。

Change stream变更过滤

如果只对某些类型的变更事件感兴趣,可以使用聚合管道的过滤步骤过滤事件。

Change Stream 故障恢复

假设在一系列写入操作的过程中,订阅change stream的应用在接收到某一个命令以后崩溃,重启后后续的变更怎么办?

  • 想要从上次中断的地方继续获取变更流,只需要保留上次变更通知中的_id即可。
  • var cs = db.collection.watch([],{resumeAfter:<_id>})
  • 即可从上一条通知中断处继续获取后续的变更通知

Change Stream的使用场景

  • 跨集群的变更复制--在源集群中订阅change stream,一旦得到任何变更立即写入目标集群。
  • 微服务联动--当一个微服务变更数据库时,其他微服务得到通知并作出相应的变更。
  • 其他任何需要系统联动的场景。

注意事项

  • change stream依赖于oplog,因此中断时间不可超过oplog回收的最大时间窗.
  • 在执行update操作时,如果只更新了部分数据,那么change stream通知的也只是增量部分。
  • 同理,删除数据时通知的仅是删除数据的_id.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值