2017-09-15 21 views
1

master/replica postgres接続がpg-promiseを使用して構築されるシナリオでは、レプリカの停止時にこれらの接続を再構築する方法はありますか?

initOptionsで渡されたエラー関数でprocess.exitCode = 1;を実行する代わりに、サービス起動時に作業接続のみを再構築しています...失敗した接続を削除するより良い方法はありますか?(レプリカとprocess.exitCode ifそのプライマリ)?Nodejsでの接続の再構築、pg-promise

const initOptions = { 
    // global event notification; 
    error: (error, e) => { 
     if (e.cn) { 
      //log 
     } 
     process.exitCode =1; 
    } 
}; 

//singleton 
const pgp = require('pg-promise')(initOptions); 


// then for each database in config, we connect and start the service 
+0

私は 'pgp.endを()'んでしたが、その後のアプリケーションは、内の接続の受け入れを停止するために知っておく必要がありますその間に – Cmag

答えて

1

モジュールpg-promiseが自動的に壊れた接続を回復することが可能な接続のプールを使用トップnode-postgres、上に構築されています。

あなたの側には何も必要ありません。接続が再び利用可能になると、クエリは再び成功します。

そして、論理的には、プライマリ接続が失われたときにprocess.exit()を実行し、レプリカ接続の損失を無視(またはログのみ)することができます。 データベースコンテキストあなたは、オブジェクトの構築時に渡すことができ、何もすることができます -

は、2つの別々の Databaseオブジェクトを介して使用されていれば、あなたは dcパラメータの助けを借りて、それらを区別することができます。

例:

const dbPrimary = pgp(primaryConnection, 'primary'); 
const dbReplica = pgp(replicaConnection, 'replica'); 

は、次にグローバルerrorハンドラ内:

const initOptions = { 
    error: (err, e) => { 
     if(e.cn) { 
      // connectivity issue: 
      console.log(e.dc, 'connection error:', err); 
      if(e.dc === 'primary') { 
       process.exit(1); 
      } 
     } 
    } 
}; 
+0

スーパー。説明をいただきありがとうございました:) pg-promiseが誤ったレプリカ接続に接続している場合、そのクライアント要求は失敗します。したがって、直ちに再試行するか、実際にはレプリカ停止時にもprocess.exitとして別のレプリカを確認する必要があります。 – Cmag

関連する問題