[rabbitmq-discuss] dropped messages on low volume

Joel Reymont joelr1 at gmail.com
Wed Jul 1 12:48:15 BST 2009

I'm running Erlang R13B01 and RabbitMQ 1.5.3 server with the Erlang  
client library.

I start 100 Erlang processes that subscribe to a single topic and  
publish a single message once all the client processes are ready. Only  
a random number of my client processes receive the message and the  
number is less than 50.

Is there an explanation?

More detail...

Client processes synchronize by monitoring a single Erlang process  
(barrier). Every client subscribes to the topic only when notified  
that the barrier is open ({'DOWN', _, process, Pid, normal}). Clients  
bump a counter in the barrier when they are up and running and the  
barrier opens once the target # of bumps has been reached.

In other words, I don't publish until everyone is ready and subscribed.

The client subscription process looks like this, where  
common:random_token() returns a 16-digit hash as a string:

     QS = [$t, $h, $q|common:random_token()],
     Q = list_to_binary(QS),
     Tok1 = common:random_token(),
     Tag = list_to_binary([QS, Tok1]),
     lib_amqp:declare_exchange(State#state.channel, Topic, <<"topic">>),
     lib_amqp:declare_queue(State#state.channel, Q),
     lib_amqp:bind_queue(State#state.channel, Topic, Q,  
     lib_amqp:subscribe(State#state.channel, Q, self(), Tag),

Publishing a message then looks like this:

     Con = lib_amqp:start_connection(Rabbit),
     Chan = lib_amqp:start_channel(Con),
     Exch = list_to_binary(Topic),
     #'exchange.declare_ok'{} = lib_amqp:declare_exchange(Chan, Exch,  
     lib_amqp:publish(Chan, Exch, <<"raw">>, MsgWithId),
     lib_amqp:publish(Chan, Exch, <<"http">>, HttpMsg),
     lib_amqp:publish(Chan, Exch, <<"flash">>, FlashMsg),
     lib_amqp:teardown(Con, Chan),

The name of the exchange is always the topic.

I know that 100 clients have subscribed and received messages because  
I trace in Erlang and count the 'basic.consume_ok' and 'basic.deliver'  
messages, e.g.

grep "basic.consume_ok" /tmp/foo|wc -l
grep "basic.deliver" /tmp/foo|wc -l

What am I doing wrong and is there a way to do it better?

All I want is to push a single message to hundreds of thousands of  
subscribers with minimum latency.

	Thanks, Joel

Mac hacker with a performance bent

More information about the rabbitmq-discuss mailing list