Java和Node.js实战 MongoDB 4.x 新特性:Change Streams 变化流

简介: MongoDB 4.0 Change Streams增强新特性,我们可以跟踪单个集合Colletion、数据库或部署集群的数据库和集合中的所有变化。

作者:Dj Walker-Morgan
译者:徐雷
原文地址:https://www.mongodb.com/blog/post/five-minute-mongodb--change-streams-and-mongodb-4x

监控数据库发生的变化是MongoDB同步数据服务的关键。我们不需要去定期轮训查询集合中的更改文档,我们就可以可以更轻松地过滤Change Streams 变化流,并立即采取处理错误。这是一种Reactive反应式编程风格,可以非常强大。如今,获取这些变更信息流非常简单。

*译者注:关于Reactive编程,Java提供了Reactive模型支持,阿里Java专家杜万老师,在阿里Java钉钉群中提供了讲座和资料。

先介绍点历史知识。在MongoDB 3.6之前,如果我们要监听MongoDB中正在发生的变化,必须“tail the oplog”,跟踪操作日志,这是一个用于复制记录变更的集合。 “tail the oplog”的过程往往最终会出现复杂的问题,不受支持的,脆弱的代码,而这些代码在生产中存在风险,难以控制,并不是我们想要的。这意味着人们会避免使用Reactive反应式编程风格。

变更流和集合Change Streams and Collections

这种问题情况在MongoDB 3.6 Change Streams新功能出现后开始发生变化。变更流使其变得简单并且支持监听集合中的数据变化,而不在需要跟踪Oplog。是不是非常简单方便?让我们看一下Java和Node.js示例中movieDetails集合中发生的一些变化。

Java实现 Change Streams的代码如下:

MongoClient mongoClient = new MongoClient( new MongoClientURI("mongodb://host1:port1,host2:port2..."));

// Select the MongoDB database and collection to open the change stream against

MongoDatabase db = mongoClient.getDatabase("myTargetDatabase");

MongoCollection<Document> collection = db.getCollection("myTargetCollection");

// Create $match pipeline stage.
List<Bson> pipeline = singletonList(Aggregates.match(Filters.or(
    Document.parse("{'fullDocument.username': 'alice'}"),
    Filters.in("operationType", asList("delete")))));

// Create the change stream cursor, passing the pipeline to the
// collection.watch() method

MongoCursor<Document> cursor = collection.watch(pipeline).iterator();

Node实现 Change Streams的代码如下:

const MongoClient = require("mongodb").MongoClient;

const uri = "MONGODBURL";

const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect().then(db => {
 const changeStream = client.db("video").collection("movieDetails").watch();
 changeStream.on("change", next => {
   console.log(next);
 });
});

此Node代码连接到Mongodb数据库。然后,它选择数据库video和movieDetails集合,并使用watch()函数创建变化流。我们使用.on添加一个事件触发器(“change”,...然后代码将在变化流changeStream中获取changeStream事件,随后它将调用一个函数,执行处理代码。在这种情况下,它只是在文档更改时打印出Change Streams 变化流事件如果我运行此代码,然后使用MongoDB Compass查看movieDetail对象细节,下面是详细例子信息

{ _id:
   { _data:
      '825C51D03F0000000129295A1004E515B4338C574BA2B9603CB1C7FB3B0446645F696400645C0EC4B74B052F9E2EF0C3810004' },
  operationType: 'replace',
  clusterTime:
   Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1548865599 },
  fullDocument:
   { _id: 5c0ec4b74b052f9e2ef0c381,
     title: 'PS I Love You',
     year: 2007,
     ...
     awards: { wins: 2, nominations: 4, text: '2 wins & 4 nominations.' },
     type: 'movie' },
  ns: { db: 'video', coll: 'movieDetails' },
  documentKey: { _id: 5c0ec4b74b052f9e2ef0c381 } 
}

我们可以在Change Events变化事件文档中阅读更多Change Events内容https://docs.mongodb.com/manual/reference/change-events/,但快速方法是可以在operationType字段中找到Change Events重要信息,即更改类型。当我们观察集合时,它可以具有插入,更新,替换,删除或无效(insert, update, replace, delete or invalidate)的值。前四种类型代表了他们的名字。我们在上面的文档中看到的是Compass通过支付替换集合中的文档进行编辑的结果。

无效的operationType在变化流中出现,其中正在监控的集合被删除或重命名,或者集合所在的数据库被删除。这是关闭change Stream变更流的信号。本文档的其余部分是有关变更内容的信息;哪个命名空间、文档结构、以及变化发生的时间。

顺便说一句,上面的示例中更改文档是在MongoDB 4.x数据库上测试的,在以前的版本_data上添加了一个字段。这是一个恢复标志字段,允许对其进行记录的应用程序使用它们在流中的该点重新开始执行未完成的任务。

深入集合Collection
MongoDB 3.6版本Change Streams变化流已经做的很好,可以跟踪集合中的数据变化。但是之前很多人被迫使用oplog来跟踪全局变化,想要对整个数据库中所有变化跟踪并处理,这种情况就比较痛苦。监控整库变化这个功能在MongoDB 4.0添加进来了。它可以在数据库或整个部署上创建Change Streams变化流的功能 - 高可用副本集或分片集群。 4.0不仅允许对集合执行watch()监控,还可以允许对数据库或整个部署集群执行watch()。例子代码如下:

const MongoClient = require("mongodb").MongoClient;

const uri ="MONGODBURL";

const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect().then(db => {
 const changeStream = client.watch();
 changeStream.on("change", next => {
   console.log(next);
});

现在,只要任何数据库中的任何集合任何数据被修改,就会打印日志到控制台。 这些不是我们要获得的唯一变化事件,还可以监控更多事件。 由于Change Streams监控已经可以监控到最广泛的范围,现在我们将看到删除集合时的drop事件,删除数据库时的dropDatabase事件以及重命名集合时rename重命名事件,都会被监控到。

如果我们只对特定数据库中发生的事件感兴趣,可以打开数据库并对其执行watch()。 我们可以获得该数据库中collection集合的所有更新,以及删除和重命名事件。 但是不会得到dropDatabase事件; 如果我们的数据库被删除,那么当数据库已经删除时,返回的结果是invalidate ,表示无效操作。

扩展学习
有了MongoDB 4.0 Change Streams增强新特性,我们可以跟踪单个集合Colletion、数据库或部署集群的数据库和集合中的所有变化。有些变化我们不会明确看到信息;必须通过在集合中创建文档来推断新集合和数据库的创建过程。

当复制到另一个MongoDB时,这些都不是大问题,因为数据库和集合创建是在新文档生成时创建的,可以推测出来。复制集合的困难点在于,检查新集合是否影响以前的集合,还有就是我们监控不到创建索引和其他操作,这些操作不会反映在为更改文档的日志中,不能通过变更流监控。

MongoDB4.0 Change Streams增强新特性 意味着我们现在更容易监控MongoDB数据库和集群活动,该功能提供了一种全新的方式将MongoDB呈现给另一个系统 - 实时监控MongoDB数据的变化。建议大家自己动手实战一下MongoDB 4.0 Change Streams。可以参考官方文档:https://docs.mongodb.com/manual/changeStreams
8、阿里巴巴Java群超过2900人
直播地址:Java技术进阶群
进群方式:钉钉扫码入群
image

阿里巴巴MongoDB群
image

相关文章
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
Java API 开发者
470 0
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
669 1
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
1192 1
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
723 0
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
632 1
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
876 0
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
452 2

推荐镜像

更多