Jonathan,
On Fri, Jun 7, 2013 at 7:03 PM, Jonathan Hodges <hodg...@gmail.com> wrote: > Hi Alexis, > > I appreciate your reply and clarifications to my misconception about > Rabbit, particularly on the copying of the message payloads per consumer. Thank-you! > It sounds like it only copies metadata like the consumer state i.e. > position in the topic messages. Basically yes. Of course when a message is delivered to N>1 *machines*, then there will be N copies, one per machine. Also, for various reasons, very tiny (<60b) messages do get copied as you'd assumed. > I don’t have experience with Rabbit and > was basing this assumption based on Google searches like the following - > http://ilearnstack.com/2013/04/16/introduction-to-amqp-messaging-with-rabbitmq/. > It seems to indicate with topic exchanges that the messages get copied to > a queue per consumer, but I am glad you confirmed it is just the metadata. Yup. That's a fairly decent article but even the good stuff uses words like "copy" without a fixed denotation. Don't believe the internets! > While you are correct the payload is a much bigger concern, managing the > metadata and acks centrally on the broker across multiple clients at scale > is also a concern. This would seem to be exasperated if you have consumers > at different speeds i.e. Storm and Hadoop consuming the same topic. > > In that scenario, say storm consumes the topic messages in real-time and > Hadoop consumes once a day. Let’s assume the topic consists of 100k+ > messages/sec throughput so that in a given day you might have 100s GBs of > data flowing through the topic. > > To allow Hadoop to consume once a day, Rabbit obviously can’t keep 100s GBs > in memory and will need to persist this data to its internal DB to be > retrieved later. I am not sure why you think this is a problem? For a fixed number of producers and consumers, the pubsub and delivery semantics of Rabbit and Kafka are quite similar. Think of Rabbit as adding an in-memory cache that is used to (a) speed up read consumption, (b) obviate disk writes when possible due to all client consumers being available and consuming. > I believe when large amounts of data need to be persisted > is the scenario described in the earlier posted Kafka paper ( > http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf) > where Rabbit’s performance really starts to bog down as compared to Kafka. Not sure what parts of the paper you mean? I read that paper when it came out. I found it strongest when describing Kafka's design philosophy. I found the performance statements made about Rabbit pretty hard to understand. This is not meant to be a criticism of the authors! I have seen very few performance papers about messaging that I would base decisions on. > This Kafka paper is looks to be a few years old Um.... Lots can change in technology very quickly :-) Eg.: At the time this paper was published, Instagram had 5m users. Six months earlier in Dec 2010, it had 1m. Since then it grew huge and got acquired. > so has something changed > within the Rabbit architecture to alleviate this issue when large amounts > of data are persisted to the internal DB? Rabbit introduced a new internal flow control system which impacted performance under steady load. This may be relevant? I couldn't say from reading the paper. I don't have a good reference for this to hand, but here is a post about external flow control that you may find amusing: http://www.rabbitmq.com/blog/2012/05/11/some-queuing-theory-throughput-latency-and-bandwidth/ > Do the producer and consumer > numbers look correct? If no, maybe you can share some Rabbit benchmarks > under this scenario, because I believe it is the main area where Kafka > appears to be the superior solution. This is from about one year ago: http://www.rabbitmq.com/blog/2012/04/25/rabbitmq-performance-measurements-part-2/ Obviously none of this uses batching, which is an easy trick for increasing throughput. YMMV. Is this helping? alexis > Thanks for educating me on these matters. > > -Jonathan > > > > On Fri, Jun 7, 2013 at 6:54 AM, Alexis Richardson <ale...@rabbitmq.com>wrote: > >> Hi >> >> Alexis from Rabbit here. I hope I am not intruding! >> >> It would be super helpful if people with questions, observations or >> moans posted them to the rabbitmq list too :-) >> >> A few comments: >> >> * Along with ZeroMQ, I consider Kafka to be one of the interesting and >> useful messaging projects out there. In a world of cruft, Kafka is >> cool! >> >> * This is because both projects come at messaging from a specific >> point of view that is *different* from Rabbit. OTOH, many other >> projects exist that replicate Rabbit features for fun, or NIH, or due >> to misunderstanding the semantics (yes, our docs could be better) >> >> * It is striking how few people describe those differences. In a >> nutshell they are as follows: >> >> *** Kafka writes all incoming data to disk immediately, and then >> figures out who sees what. So it is much more like a database than >> Rabbit, in that new consumers can appear well after the disk write and >> still subscribe to past messages. Instead, Rabbit which tries to >> deliver to consumers and buffers otherwise. Persistence is optional >> but robust and a feature of the buffer ("queue") not the upstream >> machinery. Rabbit is able to cache-on-arrival via a plugin, but this >> is a design overlay and not particularly optimal. >> >> *** Kafka is a client server system with end to end semantics. It >> defines order to include processing order, and keeps state on the >> client to do this. Group management is via a 3rd party service >> (Zookeeper? I forget which). Rabbit is a server-only protocol based >> system which maintains order on the server and through completely >> language neutral protocol semantics. This makes Rabbit perhaps more >> natural as a 'messaging service' eg for integration and other >> inter-app data transfer. >> >> *** Rabbit is a general purpose messaging system with extras like >> federation. It speaks many protocols, and has core features like HA, >> transactions, management, etc. Everything can be switched on or off. >> Getting all this to work while keeping the install light and fast, is >> quite fiddly. Kafka by contrast comes from a specific set of use >> cases, which are interesting certainly. I am not sure if Kafka wants >> to be a general purpose messaging system, but it will become a bit >> more like Rabbit if that is the goal. >> >> *** Both approaches have costs. In the case of Rabbit the cost is >> that more metadata is stored on the broker. Kafka can get performance >> gains by storing less such data. But we are talking about some N >> thousands of MPS versus some M thousands. At those speeds the clients >> are usually the bottleneck anyway. >> >> * Let me also clarify some things: >> >> *** Rabbit does NOT store multiple copies of the same message across >> queues, unless they are very small (<60b, iirc). A message delivered >> to >1 queue on 1 machine is stored once. Metadata about that message >> may be stored more than once, but, at scale, the big cost is the >> payload. >> >> *** Rabbit's vanilla install does store some index data in memory when >> messages flow to disk. You can change this by using a plugin, but >> this is a secret-menu undocumented feature. Very very few people need >> any such thing. >> >> *** A Rabbit queue is lightweight. It's just an ordered consumption >> buffer that can persist and ack. Don't assume things about Rabbit >> queues based on what you know about IBM MQ, JMS, and so forth. Queues >> in Rabbit and Kafka are not the same. >> >> *** Rabbit does not use mnesia for message storage. It has its own >> DB, optimised for messaging. You can use other DBs but this is >> Complicated. >> >> *** Rabbit does all kinds of batching and bulk processing, and can >> batch end to end. If you see claims about batching, buffering, etc., >> find out ALL the details before drawing conclusions. >> >> I hope this is helpful. >> >> Keen to get feedback / questions / corrections. >> >> alexis >> >> >> >> >> >> >> >> On Fri, Jun 7, 2013 at 2:09 AM, Marc Labbe <mrla...@gmail.com> wrote: >> > We also went through the same decision making and our arguments for Kafka >> > where in the same lines as those Jonathan mentioned. The fact that we >> have >> > heterogeneous consumers is really a deciding factor. Our requirements >> were >> > to avoid loosing messages at all cost while having multiple consumers >> > reading the same data at a different pace. On one side, we have a few >> > consumers being fed with data coming in from most, if not all, topics. On >> > the other side, we have a good bunch of consumers reading only from a >> > single topic. The big guys can take their time to read while the smaller >> > ones are mostly for near real-time events so they need to keep up the >> pace >> > of incoming messages. >> > >> > RabbitMQ stores data on disk only if you tell it to while Kafka persists >> by >> > design. From the beginning, we decided we would try to use the queues the >> > same way, pub/sub with a routing key (an exchange in RabbitMQ) or topic, >> > persisted to disk and replicated. >> > >> > One of our scenario was to see how the system would cope with the largest >> > consumer down for a while, therefore forcing the brokers to keep the data >> > for a long period. In the case of RabbitMQ, this consumer has it owns >> queue >> > and data grows on disk, which is not really a problem if you plan >> > consequently. But, since it has to keep track of all messages read, the >> > Mnesia database used by RabbitMQ as the messages index also grows pretty >> > big. At that point, the amount of RAM necessary becomes very large to >> keep >> > the level of performance we need. In our tests, we found that this an >> > adverse effect on ALL the brokers, thus affecting all consumers. You can >> > always say that you'll monitor the consumers to make sure it won't >> happen. >> > That's a good thing if you can. I wasn't ready to make that bet. >> > >> > Another point is the fact that, since we wanted to use pub/sub with a >> > exchange in RabbitMQ, we would have ended up with a lot data duplication >> > because if a message is read by multiple consumers, it will get >> duplicated >> > in the queue of each of those consumer. Kafka wins on that side too since >> > every consumer reads from the same source. >> > >> > The downsides of Kafka were the language issues (we are using mostly >> Python >> > and C#). 0.8 is very new and few drivers are available at this point. >> Also, >> > we will have to try getting as close as possible to once-and-only-once >> > guarantee. There are two things where RabbitMQ would have given us less >> > work out of the box as opposed to Kafka. RabbitMQ also provides a bunch >> of >> > tools that makes it rather attractive too. >> > >> > In the end, looking at throughput is a pretty nifty thing but being sure >> > that I'll be able to manage the beast as it grows will allow me to get to >> > sleep way more easily. >> > >> > >> > On Thu, Jun 6, 2013 at 3:28 PM, Jonathan Hodges <hodg...@gmail.com> >> wrote: >> > >> >> We just went through a similar exercise with RabbitMQ at our company >> with >> >> streaming activity data from our various web properties. Our use case >> >> requires consumption of this stream by many heterogeneous consumers >> >> including batch (Hadoop) and real-time (Storm). We pointed out that >> Kafka >> >> acts as a configurable rolling window of time on the activity stream. >> The >> >> window default is 7 days which allows for supporting clients of >> different >> >> latencies like Hadoop and Storm to read from the same stream. >> >> >> >> We pointed out that the Kafka brokers don't need to maintain consumer >> state >> >> in the stream and only have to maintain one copy of the stream to >> support N >> >> number of consumers. Rabbit brokers on the other hand have to maintain >> the >> >> state of each consumer as well as create a copy of the stream for each >> >> consumer. In our scenario we have 10-20 consumers and with the scale >> and >> >> throughput of the activity stream we were able to show Rabbit quickly >> >> becomes the bottleneck under load. >> >> >> >> >> >> >> >> On Thu, Jun 6, 2013 at 12:40 PM, Dragos Manolescu < >> >> dragos.manole...@servicenow.com> wrote: >> >> >> >> > Hi -- >> >> > >> >> > I am preparing to make a case for using Kafka instead of Rabbit MQ as >> a >> >> > broker-based messaging provider. The context is similar to that of the >> >> > Kafka papers and user stories: the producers publish monitoring data >> and >> >> > logs, and a suite of subscribers consume this data (some store it, >> others >> >> > perform computations on the event stream). The requirements are >> typical >> >> of >> >> > this context: low-latency, high-throughput, ability to deal with >> bursts >> >> and >> >> > operate in/across multiple data centers, etc. >> >> > >> >> > I am familiar with the performance comparison between Kafka, Rabbit MQ >> >> and >> >> > Active MQ from the NetDB 2011 paper< >> >> > >> >> >> http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf >> >> >. >> >> > However in the two years that passed since then the number of >> production >> >> > Kafka installations increased, and people are using it in different >> ways >> >> > than those imagined by Kafka's designers. In light of these >> experiences >> >> one >> >> > can use more data points and color when contrasting to Rabbit MQ >> (which >> >> by >> >> > the way also evolved since 2011). (And FWIW I know I am not the first >> one >> >> > to walk this path; see for example last year's OSCON session on the >> State >> >> > of MQ<http://lanyrd.com/2012/oscon/swrcz/>.) >> >> > >> >> > I would appreciate it if you could share measurements, results, or >> even >> >> > anecdotal evidence along these lines. How have you avoided the "let's >> use >> >> > Rabbit MQ because everybody else does it" route when solving problems >> for >> >> > which Kafka is a better fit? >> >> > >> >> > Thanks, >> >> > >> >> > -Dragos >> >> > >> >> >>