2017-09-08 7 views
0

私はRabbitMQを使ってNode.jsにRPCを実装しています。Node.jsを使ったRabbitMQ RPC

私はチュートリアルに従う、私は高権威であるために「rpc_client」として、すべてのクライアントのためのキューの同じ名前を主張し、ここでclient.jsは、サーバー内の関数を呼び出すことです:

const amqp = require('amqplib'); 

async function client(){ 
    let args = process.argv.slice(2); 
    let corr = generateUuid(); 
    let num = parseInt(args[0]); 
    try { 
     let conn = await amqp.connect('amqp://127.0.0.1'); 
     let ch = await conn.createChannel(); 
     let q = await ch.assertQueue('rpc_client'); 

     console.log(' [x] Requesting fib(%d)', num); 
     console.log(q.queue) 

     await ch.consume(q.queue,msg=>{ 
      if (msg.properties.correlationId == corr) { 
       console.log(' [.] Got %s', msg.content.toString()); 
       ch.ack(msg) 
       setTimeout(function() { conn.close(); process.exit(0) }, 5500); 
      } 
     },{noAck:false}); 

     ch.sendToQueue('rpc_server', 
     new Buffer(num.toString()), 
     { correlationId: corr, replyTo: q.queue }); 

    } catch(err){ 
     console.error(err); 
    } 
} 

function generateUuid() { 
    return Math.random().toString() + 
      Math.random().toString() + 
      Math.random().toString(); 
} 

client(); 

しかし、私は一度にいくつかのクライアントを実行すると、後者のクライアントは、元のクライアントの接続が閉じられるまで、消費コールバック(サーバーからの応答を取得し、それを印刷する)を実行しませんでした。例えば2番目のクライアントは応答を得てそれを印刷し、接続は5500ミリ秒で終了し、2番目のクライアントは最初のものを閉じるのを待たなければなりません。

だからなぜこれを声に出しているのですか?キューは2人の作業者の2つのマッサージを並行して消費することができるからです。

、ここserver.jsです:

async function server(){ 
    try { 
     let conn = await amqp.connect('amqp://127.0.0.1'); 
     let ch = await conn.createChannel(); 
     process.once('SIGINT',()=>conn.close()); 

     let q = await ch.assertQueue('rpc_server'); 
     ch.prefetch(1); 
     console.log(' [x] Awaiting RPC requests'); 

     await ch.consume(q.queue,msg=>{ 
      let n = parseInt(msg.content.toString()); 

      console.log(" [.] fib(%d)", n); 

      let r = fibonacci(n); 

      ch.sendToQueue(msg.properties.replyTo, 
      new Buffer(r.toString()), 
      {correlationId: msg.properties.correlationId}); 

      ch.ack(msg); 
     },{noAck:false}); 


    } catch(err) { 
     console.error(err); 
    } 
} 

server(); 

function fibonacci (n , ac1 = 1 , ac2 = 1) { 
    if(n <= 1) {return ac2}; 

    return fibonacci (n - 1, ac2, ac1 + ac2); 
} 

答えて

0

キュー名が同じであれば、それは同じキューです。同じ名前の2つのキューではありません。この場合、クライアントが並行して順番にメッセージを取得していることは意味があります。

異なるキュー名で試してみるとうまくいくはずです。

+0

なぜ、同じキューを持つサーバーが並列実行できるのですか? http://www.rabbitmq.com/tutorials/tutorial-two-javascript.html – laoqiren

+0

を参照してください。複数のコンシューマーが同じキューに登録しています。その場合、代替メッセージを受信します。奇妙なもののように、最初の消費者、そしてさらには1番目の消費者に行きます。このパターンの詳細については、https://www.rabbitmq.com/tutorials/tutorial-two-javascript.html – tbking

+0

をご覧ください。私の質問には2つのクライアントがあり、それらはサーバーの機能を呼び出し、サーバは2つのマッサージを 'rpc_client'キューに返すので、2つのクライアントはそれらを並列に処理できます。しかし、彼らは、なぜですか? – laoqiren

関連する問題