[rabbitmq-discuss] Channel thread-safety
Tim Watson
tim at rabbitmq.com
Tue Oct 23 11:42:58 BST 2012
Important addendum: channel calls are *not* thread-safe for
confirmations: The channel interface is thread-safe now, except for
counting confirms and checking!
There is an outstanding bug to review this, and the problems associated
with the fact that publishing and receiving a seqno is not an atomic
operation.
Anyway - you *may* wish to share a Channel between threads or not, but
if you're using confirms then you should *not* share a Channel between
multiple threads. I'll make sure the javadoc changes reflect this state
of affairs.
Cheers,
Tim
On 10/23/2012 11:29 AM, Tim Watson wrote:
> Actually, that's not quite right. Channels *are* thread safe in the
> java-client, and can be shared across multiple threads if you wish. As
> the Java client API documentation
> (http://www.rabbitmq.com/api-guide.html) states however:
>
> "Channel instances are safe for use by multiple threads. Requests into
> a Channel are serialized, with only one thread being able to run a
> command on the Channel at a time. Even so, applications should prefer
> using a Channel per thread instead of sharing the same Channel across
> multiple threads."
>
> In other words, because the transmission of AMQP commands via a given
> Channel is serialised, there is probably little or no benefit in
> sharing the channel between threads.
>
> Unfortunately, whilst we've updated the documentation on the website
> to reflect this change (which was merged in September 2011 and
> released in 2.7.0) we appear to have missed the javadocs for the
> Channel class - I will get that fixed asap so as to avoid any further
> confusion!
>
> Cheers,
> Tim
>
> On 10/23/2012 02:08 AM, Laurent Vauthrin wrote:
>> Thanks for clearing that up!
>>
>> On Mon, Oct 22, 2012 at 3:46 PM, Michael Klishin
>> <michael.s.klishin at gmail.com <mailto:michael.s.klishin at gmail.com>> wrote:
>>
>>
>>
>> 2012/10/22 Laurent Vauthrin <lvauthrin at gmail.com
>> <mailto:lvauthrin at gmail.com>>
>>
>> My questions are:
>> 1. Should we be using a channel per thread considering that
>> we're synchronizing the basicPublish call anyway?
>>
>>
>> Yes. Channels are just integer on the wire and a little bit of
>> memory allocated on the JVM heap. They are very cheap
>> for all intents and purposes and you are much more likely to max
>> out your OS and hardware resources (assuming 1 channel per JVM
>> thread) before
>> you run into issues with channel objects.
>>
>> 2. Can we just share one channel across all threads and not
>> synchronize the call to basicPublish?
>>
>>
>>
>> No. The real issue with shared channels is that large messages
>> will result in multiple protocol frames being sent
>> for a single basicPublish operation. When publishing on the same
>> channel from multiple threads, this may result
>> in frames being delivered out of order:
>>
>> T1 => basicPublish => [Frame11] [Frame12] [Frame13]
>> T2 => basicPublish => [Frame21] [Frame22] [Frame23]
>>
>> may result in the following delivery order, all on the same channel:
>>
>> [Frame11][Frame21][Frame12][Frame13][Frame22][Frame23]
>>
>> and because all frames are on the same channel, RabbitMQ won't be
>> able to tell how to reconstruct your messages.
>> --
>> MK
>>
>> http://github.com/michaelklishin
>> http://twitter.com/michaelklishin
>>
>>
>> _______________________________________________
>> rabbitmq-discuss mailing list
>> rabbitmq-discuss at lists.rabbitmq.com
>> <mailto:rabbitmq-discuss at lists.rabbitmq.com>
>> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
>>
>>
>>
>>
>> _______________________________________________
>> rabbitmq-discuss mailing list
>> rabbitmq-discuss at lists.rabbitmq.com
>> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
>
>
>
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-discuss at lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20121023/6b69fdfd/attachment.htm>
More information about the rabbitmq-discuss
mailing list