[rabbitmq-discuss] Channel Cost
Jason J. W. Williams
jasonjwwilliams at gmail.com
Tue Jan 27 21:08:34 GMT 2009
I think one of the issues is that a channel close is always going to
get a response, so the embedded .wait() to get a response to hangs in
a blocking state. The issue with basic_publish is that it may channel
error, or it may not, and a wait() call is going to block in non-error
conditions. I assume this is why basic_publish doesn't check for
channel errors.
It seems to me there need to be a way to set the timeout on the wait()
call (w/ msec precision). In the meantime, as a work around, I'm doing
a test publish when the channel is created, closing the channel, and
if no exception is raised re-opening the channel. If there are any
errors subsequently they don't get noticed, but this at least handles
the bulk of the channel error issues.
-J
On Tue, Jan 27, 2009 at 1:54 PM, Ben Hyde <bhyde at pobox.com> wrote:
>
> On Jan 27, 2009, at 2:34 PM, Jason J. W. Williams wrote:
>>
>> Hi Barry,
>>
>> chan_send
>> .basic_publish
>> (msg,exchange=args.exchange,routing_key=args.routing_key)
>> to an exchange that doesn't exist.
>
>
> Sometime ago, as Dmitriy had pointed out, Matthias suggested that a
> synchronous call to RabbitMQ is a good way to see if it has consumed the
> frames we previously dispatched to it. And presumably that also allows
> amqplib a chance to see any errors that consumption sent back. Dmitriy
> suggested using declare_exchange as possible choice for a synchronous call
> to the broker, and Matthias made some other suggestions.
>
> So in the following ping_channel does a meaningless exchange_declare.
>
> Jason's example of how to get basic_publish to have an error:
>
> On Jan 27, 2009, at 2:34 PM, Jason J. W. Williams wrote:
>>
>>
>> ...chan_send.basic_publish(msg,exchange=args.exchange,routing_key=args.routing_key)
>> to an exchange that doesn't exist. ..
>
> So the following code does that, followed by calling ping_channel. The
> transcript below shows amqplib reporting the error as soon as it reads off
> that the channel is closing.
>
> The source:
>
> #!/usr/bin/env python
> import amqplib.client_0_8 as amqp
> import logging
> from os import environ
>
> def ping_channel(channel):
> channel.exchange_declare("RANDOMTEXT",type='topic', passive=True)
>
>
> if __name__ == '__main__':
> logger = logging.getLogger('amqplib')
> logger.addHandler(logging.StreamHandler())
> logger.setLevel(logging.DEBUG)
> def trace(m): logger.debug('TRACE: ' + m)
> vhost=environ.get('AMQP_USERID','/')
> trace('create connection')
> connection = conn =
> amqp.Connection(environ.get('AMQP_SERVER','localhost'),
>
> userid=environ.get('AMQP_USERID','guest'),
>
> password=environ.get('AMQP_USERID','guest'),
> virtual_host=vhost)
> trace('create channel')
> channel = connection.channel()
> trace('access_request')
> channel.access_request(vhost, active=True, write=True)
> exchange_name = environ.get('AMQP_EXCHANGE','ampq.topic')
> # exchange = channel.exchange_declare(exchange_name,
> #
> environ.get('AMQP_EXCHANGE_KIND','topic'))
> trace('make message')
> msg = amqp.Message("Hi there", content_type='text/plain')
> trace('basic_publish')
> channel.basic_publish(msg, exchange_name,
> routing_key=environ.get('AMQP_ROUTING_KEY',''))
> trace('ping')
> ping_channel(channel)
> trace('done')
>
>
> The transcript:
> bash-3.2$ env - PATH=$PATH AMQP_SERVER=192.168.1.2 AMQP_EXCHANGE=bogus
> bin/foo.py
> TRACE: create connection
>> (10, 10): Connection.start
> Start from server, version: 8.0, properties: {u'platform': 'Erlang/OTP',
> u'product': 'RabbitMQ', u'version': '1.5.0', u'copyright': 'Copyright (C)
> 2007-2009 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit
> Technologies Ltd.', u'information': 'Licensed under the MPL. See
> http://www.rabbitmq.com/'}, mechanisms: ['PLAIN', 'AMQPLAIN'], locales:
> ['en_US']
> < (10, 11): Connection.start_ok
>> (10, 30): Connection.tune
> < (10, 31): Connection.tune_ok
> < (10, 40): Connection.open
>> (10, 41): Connection.open_ok
> Open OK! known_hosts [elm.cozy.org:5672]
> TRACE: create channel
> using channel_id: 1
> < (20, 10): Channel.open
>> (20, 11): Channel.open_ok
> Channel open
> TRACE: access_request
> < (30, 10): Channel.access_request
>> (30, 11): Channel.access_request_ok
> TRACE: make message
> TRACE: basic_publish
> < (60, 40): Channel.basic_publish
> TRACE: ping
> < (40, 10): Channel.exchange_declare
>> (20, 40): Channel.close
> < (20, 41): Channel.close_ok
> Closed channel #1
> Traceback (most recent call last):
> File "bin/foo.py", line 34, in <module>
> ping_channel(channel)
> File "bin/foo.py", line 8, in ping_channel
> channel.exchange_declare("RANDOMTEXT",type='topic', passive=True)
> File "/opt/local/lib/python2.5/site-packages/amqplib/client_0_8.py", line
> 1814, in exchange_declare
> (40, 11), # Channel.exchange_declare_ok
> File "/opt/local/lib/python2.5/site-packages/amqplib/client_0_8.py", line
> 203, in wait
> return self._dispatch(method_sig, args, content)
> File "/opt/local/lib/python2.5/site-packages/amqplib/client_0_8.py", line
> 115, in _dispatch
> return amqp_method(self, args)
> File "/opt/local/lib/python2.5/site-packages/amqplib/client_0_8.py", line
> 1244, in _close
> raise AMQPChannelException(reply_code, reply_text, (class_id, method_id))
> amqplib.client_0_8.AMQPChannelException: (404, u"NOT_FOUND - no exchange
> 'bogus' in vhost '/'", (60, 40), 'Channel.basic_publish')
> bash-3.2$
>
More information about the rabbitmq-discuss
mailing list