1. 什么是Change Stream
Change Stream 是MongoDB用于实现变更追踪的解决方案,类似于关系数据库的触发器,但原理不完全相同:

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

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

· insert/update/delete:插入、更新、删除;

. drop:集合被删除;

. rename:集合被重命名;

. dropDatabase:数据库被删除;

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

3. Change Stream 与可重复读
Change Stream 只推送已经在大多数节点上提交的变更操作。即“可重复读”的变更。
这个验证是通过{readConcern:"majority"}实现的。因此:

· 未开启majority readConcern的集群无法使用Change Stream;

· 当集群无法满足{w:"majority"}时,不会触发Change Stream(例如PSA架构中的S因故宕机)。

4. Change Stream 变更过滤
如果只对某些类型的变更事件感兴趣,可以使用聚合管道的过滤步骤过滤事件。
例如:
```
var cs = db.collection.watch([{
$match: {
operationType: {
$in: ['insert', 'delete']
}
}
}])
```
5. Change Stream 故障恢复
假设在一系列写入操作的过程中,订阅Change Stream的应用在接收到“写3”之后于t0时刻崩溃,重启后后续的变更怎么办?
[!qr](./images/026_t_1.png)
想要从上次中断的地方继续获取变更流,只需要保留上次变更通知中的_id即可。
右侧所示是一次Change Stream回调所返回的数据。每条这样的数据都带有一个_id,这个_id可以用于断点恢复。例如:

var cs = db.collection.watch([],{resumeAfter:<_id>})
即可从上一条通知中断处继续获取后续的变更通知。
6. Change Stream 使用场景
· 跨集群的变更复制——在源集群中订阅Change Stream, 一旦得到任何变更立即写入目标集群。

· 微服务联动——当一个微服务变更数据库时,其他微服务得到通知并做出响应的变更。

· 其他任何需要联动的场景。

MongoDB 变更流(Change Stream)介绍的更多相关文章

  1. MongoDB Change Stream:简介、尝试与应用

    在MongoDB3.6引入的新feature中,change stream无疑是非常吸引人的. Change streams allow applications to access real-tim ...

  2. java8学习之Stream介绍与操作方式详解

    关于默认方法[default method]的思考: 在上一次[http://www.cnblogs.com/webor2006/p/8259057.html]中对接口的默认方法进行了学习,那在Jav ...

  3. nodeJs文件系统(fs)与流(stream)

    一.简介 本文将介绍node.js文件系统(fs)和流(stream)的一些API已经参数使用情况. 二.目录 文件系统将介绍以下方法: 1.fs.readFile 2.fs.writeFile 3. ...

  4. IO流分类详细介绍和各种字节流类介绍与使用 过滤流 字节流

    Java基础笔记 – IO流分类详细介绍和各种字节流类介绍与使用 过滤流 字节流本文由 arthinking 发表于627 天前 ⁄ Java基础 ⁄ 评论数 1 ⁄ 被围观 2,036 views+ ...

  5. Storm概念学习系列之Stream消息流 和 Stream Grouping 消息流组

    不多说,直接上干货! Stream消息流是Storm中最关键的抽象,是一个没有边界的Tuple序列. Stream Grouping 消息流组是用来定义一个流如何分配到Tuple到Bolt. Stre ...

  6. C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...

  7. 创建一个流(Stream)可以让Bitmap或Image保存到流里面(转)

    创建一个流(Stream)可以让Bitmap或Image使用save方法将已经在bitmap上生成的图像 保存到流里面?不需要直接在硬盘上生成文件 -------------------------- ...

  8. 海量数据挖掘MMDS week3:流算法Stream Algorithms

    http://blog.csdn.net/pipisorry/article/details/49183379 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  9. mongoose中的流查询stream query

    mongoose中的流查询stream query,功能类似于php中的mysql_fetch_array,每次从集合中获取一条记录(文档) var cursor = Person.find({ oc ...

随机推荐

  1. 1.Java语言基础

    一:java语言介绍 (1). 1991年出现,1995年5月正式发布 出生地:SUN  创始人:James Gosling  2009年4月被Oracle收购 目前最新的版本2018年3月v10.0 ...

  2. logstash 正则表达式

    正则表达式 3. 使用给定好的符号去表示某个含义 4. 例如.代表任意字符 5. 正则符号当普通符号使用需要加反斜杠 正则的发展 6. 普通正则表达式 7. 扩展正则表达式 普通正则表达式 . 任意一 ...

  3. 【HarmonyOS】【Json解析】ZSON 与 HiJson 使用

    HiLog配置 为了方便调试,查看,先设置好Hilog public static final HiLogLabel loglabel = new HiLogLabel(HiLog.LOG_APP,0 ...

  4. 网络访问控制列表ACL(读懂这篇就基本够了,后面有配置案例)

    一.访问控制列表是什么? 访问控制列表(ACL)是一种基于包过滤的访问控制技术,它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃.访问控制列表被广泛地应用于路由器和三层交换机,借助于访问 ...

  5. 修复Apache Log4j任意代码执行漏洞安全风险通告

    2021年12月10日 0x01漏洞背景 Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了 ...

  6. 基于Github Actions + Docker + Git 的devops方案实践教程

    目录 为什么需要Devops 如何实践Devops 版本控制工具(Git) 学习使用 配置环境 源代码仓库 一台配置好环境的云服务器 SSH远程登录 在服务器上安装docker docker技术准备工 ...

  7. C#汽车租赁系统

    类图: 父类(车类,抽象类) /// <summary> /// 车辆基本信息类.搞一个抽象类玩玩 /// </summary> public abstract class V ...

  8. 统计图—柱状图可视化(python)

    # 柱状图 import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif']=['Fan ...

  9. get_started_3dsctf_2016 1

    拿到题目,依旧还是老样子,查看程序开启的保护和位数 可以看到程序开启了nx保护是32位程序,于是我们把程序放入ida32编译一下 一打开就能看到非常明显的get_flag这个程序,f5观察伪代码 当a ...

  10. spring security oauth2搭建resource-server demo及token改造成JWT令牌

    我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...