java - MongoDB Java Driver 的 ChangeStream 性能问题
问题描述
我需要观看来自 mongodb 的最新文档。我使用了 ChangeStream watch API 从集合中获取流文档。
我拥有的设置是一个副本集,其中 3 个节点在同一系统中运行,端口为 27017、27018 和 27019。该设置没有任何身份验证设置。
mongodb.conf 文件:
systemLog:
destination: file
logAppend: true
path: /mongodb/logs/mongodb.log
storage:
dbPath: /mongodb/data/d1
journal:
enabled: true
engine: "wiredTiger"
wiredTiger:
engineConfig:
cacheSizeGB: 4
net:
port: 27017
bindIp: localhost
我已经对其中包含 72663 个文档的文件执行了批量插入。我从下面的程序中得到的每秒处理的记录只有 8073 条。
我必须观看的 Java 代码是。
List<ServerAddress> serverAddress = Arrays.asList(new ServerAddress("localhost", 27019),new ServerAddress("localhost", 27018), new ServerAddress("localhost", 27017));
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.hosts(serverAddress)).build();
MongoClient client = MongoClients.create(settings);
int count = 0;
Instant start = null;
MongoChangeStreamCursor<ChangeStreamDocument<Document>> dep = client.getDatabase("MyDB").getCollection("TestCollection").watch().cursor();
while (true) {
while (dep.hasNext()) {
if (count == 1) {
start = Instant.now();
}
count++;
ChangeStreamDocument<Document> next = dep.next();
if (count == 72663) {
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long seconds = timeElapsed.getSeconds();
long rec = count / seconds;
System.out.println("records processed per second " + rec);
}
}
有没有办法从更改流 API 中获得更好的性能。或者是否有任何其他 API 可以让我在观看文档时获得更好的性能。或任何其他可以提供更好性能的复制属性。
解决方案
我编写并运行了一个基准测试。
在使用 i5-4460S 的 100 美元消费级 SFF 桌面上,数据库在内存中,我每秒可以获得 17k 文档写入 zram。数据库受 CPU 限制。
此时,更改流性能受插入性能的约束,更改流交付了 17k 更改/秒。
然而,更改流正在爆发,并且爆发显示出比数据库在此硬件上通过持续写入可以执行的吞吐量更高的吞吐量。
基于此,我建议更改流性能超过数据库处理写入的能力。
推荐阅读
- php - 如何使用 php 正确保护输入
- ios - swift中的音频播放器没有获得音量和音高的价值
- haskell - haskell错误在函数中将用户输入更改为用户定义的数据类型
- python - Plotly Drop Downs,输入到函数
- c# - 发出工厂方法
- visual-studio - Visual Studio 将 :1 添加到标题
- atom-editor - 无法在 Atom 中安装 platformio-ide-terminal
- php - HTML 中的多语言 PHP 内联替换([en]...[/en] 等)
- kotlin - 如何“android 媒体播放器”(Kotlin)
- java - JAXB 将内存大小 XML 减少为 Object