[rabbitmq-discuss] RabbitMQ erlang client documentation

Sylvain Hellegouarch sh at defuze.org
Thu Dec 3 21:38:48 GMT 2009


Vlad Alexandru Ionescu a écrit :
> Sylvain,
>
>> I think there is one of the test module which might need some updates 
>> then. 
> The tests work for us. They should work for you too. Type the 
> following while in the rabbitmq-erlang-client folder:
>
>  $ make all_tests
>
> (you should keep rabbitmq-server, rabbitmq-erlang-client and 
> rabbitmq-codegen in the same folder for this to work; do not start the 
> server for this, it is started by the tests).
> If the tests fail there's probably a problem with your copy. If you 
> post the output we may be able to help.

The tests are okay, it's one of the few comments within the test:

http://hg.rabbitmq.com/rabbitmq-erlang-client/file/179c76eb4087/test/test_util.erl#l49

Since that was one of the only spot where I could find documentation... 
well I thought to mention it wasn't correct :)

>
>> Should channels be on per process basis? Say I create a channel, can 
>> I publish more than once without having to wait for each ack? Or is 
>> there a sequential constraint so that the channel knows where to 
>> propagate the potential ack from the server
> You can use a channel from more than one process. The channel process 
> queues up the calls and sends them to the server one by one (sends 
> one, waits for reply, sends the next, waits for reply etc). While a 
> call is in the queue to be sent to the server, the (user) process 
> which initiated the call is blocked while the methods in front in the 
> queue are processed plus the time for our actual call.
> So the channel takes care of serializing the methods and remembers 
> which process sent which method so it can reply (return value) to user 
> processes accordingly.
> However, due to the synchronous nature of this mechanism, just one 
> channel will not utilize the entire bandwidth available (e.g. while 
> the channel is waiting for the reply, it does not send the next call). 
> For this reason, it is advisable to split tasks that have no relation 
> to each other (the order of the events does not matter between tasks) 
> so that they use separate channels.
>
> All the above applies to synchronous methods (like basic.get for 
> example).
> Asynchronous methods (like basic.publish) are not queued up. They are 
> sent immediately no matter what is in the queue (a call may end up 
> after a cast at the server even though the call was made before the 
> cast, if the call has to wait in line).
>
> You can use amqp_channel:call/{2,3} for both sync and async methods 
> (async methods return 'ok' immediately) and amqp_channel:cast/{2,3} 
> only for async methods.
>
>

Thanks that's really useful to know.

- Sylvain





More information about the rabbitmq-discuss mailing list