MongoDB Change Streams适用于实时捕获数据库变更,无需额外系统,与MongoDB紧密集成,保证变更顺序和一致性,但主要用于数据变更通知,功能相对单一。RabbitMQ是一个多功能消息队列系统,支持异步消息传递,适用于大规模消息处理,提供丰富的路由和管理功能,但需要额外部署和维护。选择依据在于应用需求:需要实时数据变更用Change Streams,需要复杂消息传递用RabbitMQ
如果你在使用MongoDB的Change Streams,并担心遗漏消息。
请选择使用startAfter或resumeAfter:
startAfter
:可以从特定的操作开始监听新的变更事件,不包括该操作。
resumeAfter
:可以在断开连接后重新启动Change Stream,从上次离开的地方继续,不会丢失任何事件。
MongoDB的Change Stream功能允许用户监听集合上的变更事件。resumeAfter
是一个重要的参数,它允许Change Stream在断开连接后从上次离开的地方继续,不会丢失任何事件。以下是三种使用resumeAfter
的示例:
示例1:基本使用
在这个示例中,我们首先创建一个Change Stream,然后获取恢复令牌(resume token),最后使用该令牌重新启动Change Stream以继续监听变更事件。
const collection = db.collection('inventory');
const changeStream = collection.watch();
changeStream.on('change', next => {
// process next document
const resumeToken = changeStream.resumeToken;
changeStream.close();
const newChangeStream = collection.watch([], { resumeAfter: resumeToken });
newChangeStream.on('change', next => {
processChange(next);
});
});
在这个示例中,我们首先监听inventory
集合上的变更事件,然后在每次变更事件触发时获取恢复令牌,并关闭当前的Change Stream。接着,我们使用获取到的恢复令牌重新创建一个新的Change Stream,以便从上次离开的地方继续监听变更事件。
示例2:使用恢复令牌重启Change Stream
在这个示例中,我们从上一个Change Stream中获取恢复令牌,并使用该令牌作为参数重启Change Stream。
var resumeToken = previousCursor.GetResumeToken();
var options = new ChangeStreamOptions { ResumeAfter = resumeToken };
var cursor = inventory.Watch(options);
cursor.MoveNext();
var next = cursor.Current.First();
cursor.Dispose();
在这个示例中,我们首先从之前的Change Stream中获取恢复令牌,然后创建一个新的Change Stream选项对象,并设置ResumeAfter
属性为获取到的恢复令牌。接着,我们使用这个选项对象重启Change Stream,并处理接下来的变更事件。
示例3:异步重启Change Stream
在这个示例中,我们使用异步方式重启Change Stream,并处理变更事件。
val resumeToken = BsonDocument()
val job = launch {
val changeStream = collection.watch()
.resumeAfter(resumeToken)
changeStream.collect { println(it) }
}
在这个示例中,我们首先创建一个空的恢复令牌对象,然后使用launch
函数异步地重启Change Stream,并使用resumeAfter
方法指定恢复令牌。接着,我们使用collect
方法处理变更事件,并打印每个事件。
以上三个示例展示了如何使用resumeAfter
参数在断开连接后重新启动Change Stream,从上次离开的地方继续监听变更事件,确保不会丢失任何事件。