MongoDB的触发器-Change Stream
发布日期:2021-11-15 14:57:41 浏览次数:29 分类:技术文章

本文共 1131 字,大约阅读时间需要 3 分钟。

Change Stream是MongoDB用于实现变更追踪的解决方法,类似关系数据库的触发器。

Change Stream与关系数据库的触发器的对比

Change Stream 关系数据库的触发器
触发方式 异步 同步
触发位置 应用回调事件 数据库触发器
触发次数 每个订阅事件的客户端 1次
故障恢复 可以从上次断点重新触发 事务回滚

Change Stream能够跟踪的变更事件包括

  • insert/update/delete
  • drop
  • rename
  • dropDatabase
  • invalidate

注:drop/rename/dropDatabase将导致invalidate被触发,并关闭Change Stream

Change Stream也可以通过聚合管道的过滤,使它仅仅跟踪某些变更的事件,例:

db.collection.watch([{
$match: {
operationType: {
$in: ['insert', 'delete'] } }}])

上述例子用于跟踪操作为insert和delete的事件。

Change Stream的故障恢复:

# <_id>为上一次回调所返回的_id值,用于恢复到那次断点db.collection.watch([],{
resumeAfter: <_id>})

Change Stream开启条件

  • 配置文件添加replication.enableMajorityReadConcern: true,才可以使用Change Stream
  • 若集群中无法满足{w: “majority”}时,将不会触发Change Stream

例如PSA架构中的S因故障宕机,执行操作时将满足{w: “majority”},也就将无法触发Change Stream,故PSA架构不建议使用。

使用场景

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

注意

  • Change Stream依赖于oplog,中断时间不能超过oplog回收的最大时间窗,如果超过oplog回收的最大时间窗,将无法使Change Stream从上次断点的位置重新触发
  • 执行update操作时,如果只更新了部分数据,那么Change Stream通知的也是增量部分
  • 执行delete操作时,Change Stream通知的也只是删除数据的_id,并不会通知全部数据

注:MongoDB实例使用Change Stream的代码将在后面有时间的时间粘贴上去

转载地址:https://blog.csdn.net/qq_39741836/article/details/105954965 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MongoDB 搭建高可用集群(分片副本集)
下一篇:限制MongoDB使用的内存

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月23日 23时09分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章