首页 > 解决方案 > 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 可以让我在观看文档时获得更好的性能。或任何其他可以提供更好性能的复制属性。

标签: javamongodbperformancechangestream

解决方案


我编写并运行了一个基准测试

在使用 i5-4460S 的 100 美元消费级 SFF 桌面上,数据库在内存中,我每秒可以获得 17k 文档写入 zram。数据库受 CPU 限制。

此时,更改流性能受插入性能的约束,更改流交付了 17k 更改/秒。

然而,更改流正在爆发,并且爆发显示出比数据库在此硬件上通过持续写入可以执行的吞吐量更高的吞吐量。

基于此,我建议更改流性能超过数据库处理写入的能力。


推荐阅读