強まっていこう

あっちゃこっちゃへ強まっていくためのブログです。

RabbitMQ で Routing (チュートリアル4 Routing)

さて今回は本家チュートリアル 4 Routing をやってまいります。
Routing と言ったって Receiver 側で名前を OR で待ち受けれるだけと言う簡単な機能です。

pub_r.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.assertExchange(a.exchange, 'direct', {
    durable: false
  });
  const q = await ch.assertQueue('', {
    exclusive: true
  });
  a.routingKeys.split(',').forEach(async routingKey => {
    await ch.bindQueue(q.queue, a.exchange, routingKey);
  });
  console.log('Waiting exchange=%s, routing_keys=%s', a.exchange, a.routingKeys);
  await ch.consume(q.queue, 
    msg => {
      console.log('Received: %s', msg.content.toString());
    },
    {
      noAck: true
    }
  );
};
main();

function getArgs() {
  if (process.argv.length < 4) { usage(); }
  return {
    exchange: process.argv[2],
    routingKeys: process.argv[3]
  };
}

function usage() {
  const usage = `sub_r.js EXCHANGE_NAME ROUTING_KEYS(CSV)`;
  console.log(usage);
  process.exit();
}
await ch.assertExchange(a.exchange, 'direct', {
  durable: false
});

Exchange のタイプを direct にします。

a.routingKeys.split(',').forEach(async routingKey => {
  await ch.bindQueue(q.queue, a.exchange, routingKey);
});

bindQueue する時に、第3引数に対して待ち受ける routingKey を指定します。複数指定が可能です。

次は Sender 側。

sub_r.js

#!/usr/bin/env node

const amqp = require('amqplib');
const my = require('./my.js');

async function main() {
  const a = getArgs();
  const conn = await amqp.connect(my.conf).catch(my.die);
  const ch = await conn.createChannel();
  await ch.publish(a.exchange, a.routingKey, Buffer.from(a.msg));
  console.log('Published exchange=%s, routing_key: %s', a.exchange, a.routingKey, a.msg);
  await ch.close();
  await conn.close();
};
main();

function getArgs() {
  if (process.argv.length < 5) { usage(); }
  return {
    exchange: process.argv[2],
    routingKey: process.argv[3],
    msg: process.argv.slice(3).join(' '),
  };
}

function usage() {
  const usage = `pub_r.js EXCHANGE_NAME ROUTING_KEY MESSAGE`;
  console.log(usage);
  process.exit();
}
await ch.publish(a.exchange, a.routingKey, Buffer.from(a.msg));

publish 時に routingKeys を与えます。

では早速コマンドを実行し挙動を見てみましょう。

./sub_r routing aaa
./sub_r routing aaa,bbb

と2つ Receiver を立ち上げ

./pub_r routing aaa AAA
./pub_r routing bbb BBB

と Sender で Message を投げてみてください。

aaa には AAA だけが
aaa,bbb には AAA と BBB が表示されます。

さて次回は、チュートリアル 5 に相当する Topic をやっていきます。Topic と言うとこれまたわけがわかりませんが、単なる部分一致です。