

Node.jsのMongoDBドライバーでレプリカセットに接続し、ChangeStreamでコレクションの監視を行っております。プライマリノードをダウンさせた際に、MongoClientは新しいプライマリノードに自動的に再接続しているようなのですが、ChangeStreamがダウンしたプライマリノードに対して再接続のエラー（MongoServerSelectionError）を上げてきます。再接続が発生してもコレクションの監視を継続したいのですがエラーが発生して監視が継続できずに困っています。ダウンしたプライマリに対する再接続エラーを回避するにはどうすればいいでしょうか。

以下はコードになります。

[code]

    const { MongoClient } = require('mongodb');
    const express = require('express');
    
    const app = express();
    
    app.get('/start', async(req, res)=>{
        try {
            const uri = 'mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/test?replicaSet=test';
            const options = { useNewUrlParser: true, useUnifiedTopology: true};
            
            const client = new MongoClient(uri, options);
            await client.connect();
    
            const changeStream = client.watch( [ { $match: { operationType: 'insert' } } ] );
    
            changeStream.on('change', (change) =>{
                console.log(change);
            });
    
            changeStream.on('error', (error) => {
                console.log(error);
                //エラーになった時点のchangeStreamが持つMongoClientの情報を見る限り、新しいプライマリノードに接続できている
                changeStream.parent.db('test').admin().serverStatus().then((result) => {
                    console.log(result.host);
                    console.log(result.repl);
                })
                .catch((error) => {
                    console.log(error);
                });
            });
            res.send('OK');
        }
        catch(error){
            console.error(error);
            res.status(500).send('ERROR');
        }
    });
    
    app.listen(3000, ()=>{
        console.log('start server');
    });
    
[/code]

27017で起動するプライマリをダウンさせると、しばらくして以下のような再接続のタイムアウトでエラーとなります。

[code]

    MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
        at Timeout._onTimeout (/etc/test/node_modules/mongodb/lib/sdam/topology.js:277:38)
        at listOnTimeout (internal/timers.js:557:17)
        at processTimers (internal/timers.js:500:7) {
      reason: TopologyDescription {
        type: 'ReplicaSetWithPrimary',
        servers: Map(3) {
          '127.0.0.1:27017' => [ServerDescription],
          '127.0.0.1:27018' => [ServerDescription],
          '127.0.0.1:27019' => [ServerDescription]
        },
        stale: false,
        compatible: true,
        heartbeatFrequencyMS: 10000,
        localThresholdMS: 15,
        setName: 'test',
        maxElectionId: new ObjectId("7fffffff0000000000000003"),
        maxSetVersion: 5,
        commonWireVersion: 0,
        logicalSessionTimeoutMinutes: 30
      },
      code: undefined,
      [Symbol(errorLabels)]: Set(0) {}
    }
    
[/code]

また、エラーの際に出しているchangeStreamが持つMongoClientの情報は以下のようになります。これを見る限り、新しいプライマリの27018に接続できているように見えるのですが、ダウンしたプライマリノードへの再接続エラーが上がってくるのがどうしてなのかが分かりません。

[code]

    localhost.localdomain:27018
    {
      topologyVersion: { processId: new ObjectId("641bd8d18822f6cac079f2ef"), counter: 6 },
      hosts: [ '127.0.0.1:27017', '127.0.0.1:27018', '127.0.0.1:27019' ],
      setName: 'test',
      setVersion: 5,
      isWritablePrimary: true,
      secondary: false,
      primary: '127.0.0.1:27018',
      me: '127.0.0.1:27018',
      electionId: new ObjectId("7fffffff0000000000000006"),
      lastWrite: {
        opTime: { ts: new Timestamp({ t: 1679546778, i: 1 }), t: 6 },
        lastWriteDate: 2023-03-23T04:46:18.000Z,
        majorityOpTime: { ts: new Timestamp({ t: 1679546778, i: 1 }), t: 6 },
        majorityWriteDate: 2023-03-23T04:46:18.000Z
      },
      primaryOnlyServices: {
        TenantMigrationDonorService: { state: 'running', numInstances: 0 },
        TenantMigrationRecipientService: { state: 'running', numInstances: 0 }
      },
      rbid: 1
    }
    
    
[/code]

動作環境は以下になります。  
OS：CentOS8  
MongoDB：5.0.15  
MongoDB Node Driver：5.1.0  
Node.js：14.21.3


CC BY-SA 4.0
2023-03-23T05:09:53.317
94283
2023-03-23T05:47:04.240
2023-03-23T05:47:04.240
19027
19027
question
node.js mongodb
MongoDBのChangeStreamのレプリカセットでの挙動