[rabbitmq-discuss] Publish to queue fails but publish to direct exchange works
Matthias Radestock
matthias at rabbitmq.com
Fri Jun 18 08:07:09 BST 2010
Raphael,
Raphael Simon wrote:
> <matthias at rabbitmq.com <mailto:matthias at rabbitmq.com>> wrote:
> Simply running 'rabbitmqctl list_bindings' should give the same
> results. Please do that, just to check.
>
> Yes indeed but where is the fun in doing that? OK more seriously I did
> not understand the subtlety of the empty spaces, now I do (as a side
> note it would be nice to have something rather than blank in this case
> maybe *** or ---).
The reason we don't map the blank exchange name to something else is
that RabbitMQ permits anything in the exchange name, so *** and ---
actually are valid exchange names.
> I can't think of a place where we would delete a binding. We only
> ever delete queues.
Are all AMQP interactions going through nanite? I can see there aren't
any queue.unbind actions in that code base.
> Is this reproducible at all? I suspect not :(
>
> No it has only happens about 15 times on the course of two days. During
> these two days our system was having issues and weird things could have
> happened on the broker (e.g. the queue could have been deleted and
> recreated).
Queue creation and deletion, and all they entail, e.g. addition/removal
of the default bindings, are meant to be atomic. And the code dealing
with that looks correct. But ...
> What version of rabbit are you running?
>
> 1.7.2
I suggest you upgrade. The queue and exchange code has changed quite a
bit in the recent release. While I do not recall us spotting any
problems in the previous version that would explain the behaviour you
are seeing, it is nevertheless possible that there was a bug in the
previous code which has been eradicated by other changes.
> Interesting. auto-delete exchanges are very rare. In fact I do not
> know of anybody else using them. So it's possible there is a bug in
> that code that has laid dormant for years. Can you explain your
> use-case for auto-delete exchanges?
>
> Embarrassingly enough, I can't :) The fact that we are using direct
> exchanges for these queues was a bug we introduced, we will be removing
> them.
ok. If you *do* think of a use case for auto-delete exchanges, please
let us know. The AMQP 0-9-1 spec actually removes that feature, but we
are having second thoughts on whether that was the right thing to do.
> I recreated some bindings from within the broker (directly in mnesia)
> and now things started working again. Is there a better way to re-create
> the binding to the default exchange without having to re-create the queue?
You should be able to issue an appropriate queue.bind command. As I
mentioned earlier, such explicit operations on the default exchange
should imo not be permitted, but rabbit does and it's a grey area of the
spec. So currently it should work, just don't write any code that
depends on it.
> I should probably mention that sending the following queue.bind
> packet didn't seem to help (rabbitmqctl list_bindings still shows the
> binding missing).
>
> [:sending,
> #<AMQP::Protocol::Queue::Bind:0x9b26778
> @arguments=nil,
> @debug=1,
> @exchange=
> "nanite-rs-instance-fd0416fe31d7b019112c2c0adce9b4e4a261bab1-1094976",
> @nowait=true,
> @queue="nanite-rs-instance-fd0416fe31d7b019112c2c0adce9b4e4a261bab1-1094976",
> @routing_key=nil,
> @ticket=1>]
>
The exchange in the above should be blank.
Regards,
Matthias.
More information about the rabbitmq-discuss
mailing list