I'm trying to wrap my head around exchanges,queues, routing keys. My assumption which code is proving incorrect is: I can create a single exchange, with multiple queues. A consumer can point to a particular queue and get messages just for that queue. Now here is where my brain loses the plot: I had assumed I could use routing keys to have particular consumers just get messages on a queue that match a particular "routing_key'.<div><br></div><div>So assuming I have a queue FOO and a queue BAR, I'd expect the below senders messages to queue BAR to NOT show up on queue FOO. However, when running the below, the queue FOO receiver receives messages if the routing key matches&nbsp;</div><div><br></div><div>% python send.py a.b.c</div><div>% python recy.py a.b.c</div><div>(receives a message on QUEUE FOO since it appears routing key is matching)</div><div><br></div><div>Are routing keys global? Ie, if you have a key a.b.c any body on any queue will match that?</div><div><br></div><div>What I'm trying to achieve is the ability to send certain messages that only a group of consumers on a particular "queue" will process.</div><div><br></div><div>Thanks,</div><div><br></div><div>Rich</div><div><br></div><div><br></div><div><div><font face="'courier new', monospace">#!/usr/bin/env python</font></div><div><font face="'courier new', monospace">import pika</font></div><div><font face="'courier new', monospace">import sys</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">ex = "dev.test"</font></div><div><font face="'courier new', monospace">q = "BAR"</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">connection = pika.BlockingConnection(pika.ConnectionParameters(</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; host='127.0.0.1'))</font></div><div><font face="'courier new', monospace">channel = connection.channel()</font></div><div><font face="'courier new', monospace">channel.exchange_declare(exchange=ex,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type='direct', durable=True)</font></div><div><font face="'courier new', monospace">result = channel.queue_declare(queue=q,auto_delete=False, durable=True)</font></div><div><font face="'courier new', monospace">print "queue %s" % result.method.queue</font></div><div><font face="'courier new', monospace">channel.queue_bind(exchange=ex,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;queue=q)</font></div><div><font face="'courier new', monospace">routing_key = sys.argv[1] if len(sys.argv) &gt; 1 else 'anonymous.info'</font></div><div><font face="'courier new', monospace">message = "hello"</font></div><div><font face="'courier new', monospace">for i in range(1,2):</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; channel.basic_publish(exchange=ex,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; routing_key=routing_key,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body=message,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; properties=pika.BasicProperties(</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delivery_mode = 2,&nbsp;</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ))</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; print " [x] Sent %r" % (message,)</font></div></div><div><br></div><div><br></div><div>recv:</div><div><br></div><div><div><font face="'courier new', monospace">#!/usr/bin/env python</font></div><div><font face="'courier new', monospace">import pika</font></div><div><font face="'courier new', monospace">import sys</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">ex = "dev.test"</font></div><div><font face="'courier new', monospace">q = "FOO"</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">connection = pika.BlockingConnection(pika.ConnectionParameters(</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; host='127.0.0.1'))</font></div><div><font face="'courier new', monospace">channel = connection.channel()</font></div><div><font face="'courier new', monospace">channel.exchange_declare(exchange=ex,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type='direct', durable=True)</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">result = channel.queue_declare(queue=q, durable=True)</font></div><div><font face="'courier new', monospace">queue_name = result.method.queue</font></div><div><font face="'courier new', monospace">binding_keys = sys.argv[1:]</font></div><div><font face="'courier new', monospace">if not binding_keys:</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; print &gt;&gt; sys.stderr, "Usage: %s [binding_key]..." % (sys.argv[0],)</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; sys.exit(1)</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">for binding_key in binding_keys:</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; channel.queue_bind(exchange=ex,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;queue=queue_name,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;routing_key=binding_key)</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">print ' [*] Waiting for logs. To exit press CTRL+C'</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">def callback(ch, method, properties, body):</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; print "Routing key: %r" % (method.routing_key)</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; print "Body %r" % (body,)</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">channel.basic_consume(callback,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queue=queue_name,</font></div><div><font face="'courier new', monospace">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; no_ack=True)</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">channel.start_consuming()</font></div></div><div><br></div>