What if you messaging requirements are in the 100's GBSs? Would you say RabbitMQ is probably a better fit?
On Jun 8, 2013, at 4:03 PM, Jonathan Hodges <hodg...@gmail.com> wrote: > I am not making any assumptions other than Rabbit needs to maintain the > state of the consumers. As the Kafka docs point out this is the > fundamental difference between most providers in the space and Kafka. > > Thinking of a high throughput stream of messages and many active consumers > of different speeds, I am struggling with how Rabbit can avoid random I/O > with all the acks. Each consumer’s state is certainly not linearly stored > on disk so there would have to be seeks. Further log-structured merge > trees are used in NoSQL stores like Cassandra and are optimized for random > read access. Why do you feel ‘Rabbit does not do lots of random IO?’ > > Looking at some docs on the Rabbit site they seem to mention that > performance degrades as the size of the persistent message store increases. > Too much random I/O could certainly explain this degradation. > > http://www.rabbitmq.com/blog/2011/09/24/sizing-your-rabbits/ > > The use case I have been talking about all along is a continuous firehose > of data with throughput in the 100s of thousands messages per second. You > will have 10-20 consumers of different speeds ranging from real-time > (Storm) to batch (Hadoop). This means the message store is in the 100s GBs > to terabytes range at all times. > > -Jonathan > > > > On Sat, Jun 8, 2013 at 2:09 PM, Alexis Richardson < > alexis.richard...@gmail.com> wrote: > >> Jonathan >> >> I am aware of the difference between sequential writes and other kinds >> of writes ;p) >> >> AFAIK the Kafka docs describe a sort of platonic alternative system, >> eg "normally people do this.. Kafka does that..". This is a good way >> to explain design decisions. However, I think you may be assuming >> that Rabbit is a lot like the generalised other system. But it is not >> - eg Rabbit does not do lots of random IO. I'm led to understand that >> Rabbit's msg store is closer to log structured storage (a la >> Log-Structured Merge Trees) in some ways. However, Rabbit does do >> more synchronous I/O, and has a different caching strategy (AFAIK). >> "It's complicated" >> >> In order to help provide useful info to the community, please could >> you describe a concrete test that we could discuss? I think that >> would really help. You mentioned a scenario with one large data set >> being streamed into the broker(s), and then consumed (in full?) by 2+ >> consumers of wildly varying speeds. Could you elaborate please? >> >> alexis >> >> >> Also, this is probably OT but I have never grokked this in the Design Doc: >> >> "Consumer rebalancing is triggered on each addition or removal of both >> broker nodes and other consumers within the same group. For a given >> topic and a given consumer group, broker partitions are divided evenly >> among consumers within the group." >> >> When a new consumer and/or partition appears, can messages in the >> broker get "moved" from one partition to another? >> >> >> On Sat, Jun 8, 2013 at 12:53 PM, Jonathan Hodges <hodg...@gmail.com> >> wrote: >>> On Sat, Jun 8, 2013 at 2:09 AM, Jonathan Hodges <hodg...@gmail.com> >> wrote: >>>> Thanks so much for your replies. This has been a great help >> understanding >>>> Rabbit better with having very little experience with it. I have a few >>>> follow up comments below. >>> >>> Happy to help! >>> >>> I'm afraid I don't follow your arguments below. Rabbit contains many >>> optimisations too. I'm told that it is possible to saturate the disk >>> i/o, and you saw the message rates I quoted in the previous email. >>> YES of course there are differences, mostly an accumulation of things. >>> For example Rabbit spends more time doing work before it writes to >>> disk. >>> >>> It would be great if you can you detail some of the optimizations? It >>> would seem to me Rabbit has much more overhead due to maintaining state >> of >>> the consumers as well as general messaging processing which makes it >>> impossible to manage the same write throughput as Kafka when you need to >>> persist large amounts of data to disk. I definitely believe you that >>> Rabbit can saturate the disk but it is much more seek centric i.e. random >>> access read/writes vs sequential read/writes. Kafka saturates the disk >>> too, but since it leverages sequential disk I/O is orders of magnitude >> more >>> efficient persisting to disk than random access. >>> >>> >>> You said: >>> >>> "Since Rabbit must maintain the state of the >>> consumers I imagine it’s subjected to random data access patterns on disk >>> as opposed to sequential." >>> >>> I don't follow the logic here, sorry. >>> >>> Couple of side comments: >>> >>> * In your Hadoop vs RT example, Rabbit would deliver the RT messages >>> immediately and write the rest to disk. It can do this at high rates >>> - I shall try to get you some useful data here. >>> >>> * Bear in mind that write speed should be orthogonal to read speed. >>> Ask yourself - how would Kafka provide a read cache, and when might >>> that be useful? >>> >>> * I'll find out what data structure Rabbit uses for long term >> persistence. >>> >>> What I am saying here is when Rabbit needs to retrieve and persist each >>> consumer’s state from its internal DB this information isn’t linearly >>> persisted on disk so it requires disk seeks which is in much less >>> inefficient than sequential access. You do get the difference here, >>> correct? Sequential reads from disk are nearly 1.5x faster than random >>> reads from memory and 4-5 orders of magnitude faster than random reads >> from >>> disk (http://queue.acm.org/detail.cfm?id=1563874). >>> >>> As was detailed at length in my previous post Kafka uses the OS >>> pagecache/sendfile which is much more efficient than memory or >> applications >>> cache. >>> >>> That would be awesome if you can confirm what Rabbit is using as a >>> persistent data structure. More importantly, whether it is BTree or >>> something else, is the disk i/o random or linear? >>> >>> >>> "Quoting the Kafka design page ( >>> http://kafka.apache.org/07/design.html) performance of sequential >> writes on >>> a 6 7200rpm SATA RAID-5 array is about 300MB/sec but the performance of >>> random writes is only about 50k/sec—a difference of nearly 10000X." >>> >>> Depending on your use case, I'd expect 2x-10x overall throughput >>> differences, and will try to find out more info. As I said, Rabbit >>> can saturate disk i/o. >>> >>> This is only speaking of the use case of high throughput with persisting >>> large amounts of data to disk where there is 4 orders of magnitude more >>> than 10x difference. It all comes down to random vs sequential >>> writes/reads to disk as I mentioned above. >>> >>> >>> On Sat, Jun 8, 2013 at 2:07 AM, Alexis Richardson < >>> alexis.richard...@gmail.com> wrote: >>> >>>> Jonathan >>>> >>>> On Sat, Jun 8, 2013 at 2:09 AM, Jonathan Hodges <hodg...@gmail.com> >> wrote: >>>>> Thanks so much for your replies. This has been a great help >>>> understanding >>>>> Rabbit better with having very little experience with it. I have a >> few >>>>> follow up comments below. >>>> >>>> Happy to help! >>>> >>>> I'm afraid I don't follow your arguments below. Rabbit contains many >>>> optimisations too. I'm told that it is possible to saturate the disk >>>> i/o, and you saw the message rates I quoted in the previous email. >>>> YES of course there are differences, mostly an accumulation of things. >>>> For example Rabbit spends more time doing work before it writes to >>>> disk. >>>> >>>> You said: >>>> >>>> "Since Rabbit must maintain the state of the >>>> consumers I imagine it’s subjected to random data access patterns on >> disk >>>> as opposed to sequential." >>>> >>>> I don't follow the logic here, sorry. >>>> >>>> Couple of side comments: >>>> >>>> * In your Hadoop vs RT example, Rabbit would deliver the RT messages >>>> immediately and write the rest to disk. It can do this at high rates >>>> - I shall try to get you some useful data here. >>>> >>>> * Bear in mind that write speed should be orthogonal to read speed. >>>> Ask yourself - how would Kafka provide a read cache, and when might >>>> that be useful? >>>> >>>> * I'll find out what data structure Rabbit uses for long term >> persistence. >>>> >>>> >>>> "Quoting the Kafka design page ( >>>> http://kafka.apache.org/07/design.html) performance of sequential >> writes >>>> on >>>> a 6 7200rpm SATA RAID-5 array is about 300MB/sec but the performance of >>>> random writes is only about 50k/sec—a difference of nearly 10000X." >>>> >>>> Depending on your use case, I'd expect 2x-10x overall throughput >>>> differences, and will try to find out more info. As I said, Rabbit >>>> can saturate disk i/o. >>>> >>>> alexis >>>> >>>> >>>> >>>> >>>>> >>>>>> 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. >>>>> >>>>> >>>>> Actually I think this is the main use case that sets Kafka apart from >>>>> Rabbit and speaks to the poster’s ‘Arguments for Kafka over RabbitMQ’ >>>>> question. As you mentioned Rabbit is a general purpose messaging >> system >>>>> and along with that has a lot of features not found in Kafka. There >> are >>>>> plenty of times when Rabbit makes more sense than Kafka, but not when >> you >>>>> are maintaining large message stores and require high throughput to >> disk. >>>>> >>>>> Persisting 100s GBs of messages to disk is a much different problem >> than >>>>> managing messages in memory. Since Rabbit must maintain the state of >> the >>>>> consumers I imagine it’s subjected to random data access patterns on >> disk >>>>> as opposed to sequential. Quoting the Kafka design page ( >>>>> http://kafka.apache.org/07/design.html) performance of sequential >>>> writes on >>>>> a 6 7200rpm SATA RAID-5 array is about 300MB/sec but the performance >> of >>>>> random writes is only about 50k/sec—a difference of nearly 10000X. >>>>> >>>>> They go on to say persistent data structure used in messaging systems >>>>> metadata is often a BTree. BTrees are the most versatile data >> structure >>>>> available, and make it possible to support a wide variety of >>>> transactional >>>>> and non-transactional semantics in the messaging system. They do come >>>> with >>>>> a fairly high cost, though: Btree operations are O(log N). Normally >> O(log >>>>> N) is considered essentially equivalent to constant time, but this is >> not >>>>> true for disk operations. Disk seeks come at 10 ms a pop, and each >> disk >>>> can >>>>> do only one seek at a time so parallelism is limited. Hence even a >>>> handful >>>>> of disk seeks leads to very high overhead. Since storage systems mix >> very >>>>> fast cached operations with actual physical disk operations, the >> observed >>>>> performance of tree structures is often superlinear. Furthermore >> BTrees >>>>> require a very sophisticated page or row locking implementation to >> avoid >>>>> locking the entire tree on each operation. The implementation must >> pay a >>>>> fairly high price for row-locking or else effectively serialize all >>>> reads. >>>>> Because of the heavy reliance on disk seeks it is not possible to >>>>> effectively take advantage of the improvements in drive density, and >> one >>>> is >>>>> forced to use small (< 100GB) high RPM SAS drives to maintain a sane >>>> ratio >>>>> of data to seek capacity. >>>>> >>>>> Intuitively a persistent queue could be built on simple reads and >> appends >>>>> to files as is commonly the case with logging solutions. Though this >>>>> structure would not support the rich semantics of a BTree >> implementation, >>>>> but it has the advantage that all operations are O(1) and reads do not >>>>> block writes or each other. This has obvious performance advantages >> since >>>>> the performance is completely decoupled from the data size--one server >>>> can >>>>> now take full advantage of a number of cheap, low-rotational speed >> 1+TB >>>>> SATA drives. Though they have poor seek performance, these drives >> often >>>>> have comparable performance for large reads and writes at 1/3 the >> price >>>> and >>>>> 3x the capacity. >>>>> >>>>> Having access to virtually unlimited disk space without penalty means >>>> that >>>>> we can provide some features not usually found in a messaging system. >> For >>>>> example, in kafka, instead of deleting a message immediately after >>>>> consumption, we can retain messages for a relative long period (say a >>>> week). >>>>> >>>>> Our assumption is that the volume of messages is extremely high, >> indeed >>>> it >>>>> is some multiple of the total number of page views for the site >> (since a >>>>> page view is one of the activities we process). Furthermore we assume >>>> each >>>>> message published is read at least once (and often multiple times), >> hence >>>>> we optimize for consumption rather than production. >>>>> >>>>> There are two common causes of inefficiency: too many network >> requests, >>>> and >>>>> excessive byte copying. >>>>> >>>>> To encourage efficiency, the APIs are built around a "message set" >>>>> abstraction that naturally groups messages. This allows network >> requests >>>> to >>>>> group messages together and amortize the overhead of the network >>>> roundtrip >>>>> rather than sending a single message at a time. >>>>> >>>>> The MessageSet implementation is itself a very thin API that wraps a >> byte >>>>> array or file. Hence there is no separate serialization or >>>> deserialization >>>>> step required for message processing, message fields are lazily >>>>> deserialized as needed (or not deserialized if not needed). >>>>> >>>>> The message log maintained by the broker is itself just a directory of >>>>> message sets that have been written to disk. This abstraction allows a >>>>> single byte format to be shared by both the broker and the consumer >> (and >>>> to >>>>> some degree the producer, though producer messages are checksumed and >>>>> validated before being added to the log). >>>>> >>>>> Maintaining this common format allows optimization of the most >> important >>>>> operation: network transfer of persistent log chunks. Modern unix >>>> operating >>>>> systems offer a highly optimized code path for transferring data out >> of >>>>> pagecache to a socket; in Linux this is done with the sendfile system >>>> call. >>>>> Java provides access to this system call with the >> FileChannel.transferTo >>>>> api. >>>>> >>>>> To understand the impact of sendfile, it is important to understand >> the >>>>> common data path for transfer of data from file to socket: >>>>> >>>>> 1. The operating system reads data from the disk into pagecache in >>>> kernel >>>>> space >>>>> 2. The application reads the data from kernel space into a >> user-space >>>>> buffer >>>>> 3. The application writes the data back into kernel space into a >> socket >>>>> buffer >>>>> 4. The operating system copies the data from the socket buffer to >> the >>>> NIC >>>>> buffer where it is sent over the network >>>>> >>>>> This is clearly inefficient, there are four copies, two system calls. >>>> Using >>>>> sendfile, this re-copying is avoided by allowing the OS to send the >> data >>>>> from pagecache to the network directly. So in this optimized path, >> only >>>> the >>>>> final copy to the NIC buffer is needed. >>>>> >>>>> We expect a common use case to be multiple consumers on a topic. Using >>>> the >>>>> zero-copy optimization above, data is copied into pagecache exactly >> once >>>>> and reused on each consumption instead of being stored in memory and >>>> copied >>>>> out to kernel space every time it is read. This allows messages to be >>>>> consumed at a rate that approaches the limit of the network >> connection. >>>>> >>>>> >>>>> So in the end it would seem Kafka’s specialized nature to write data >>>> first >>>>> really shines over Rabbit when your use case requires a very high >>>>> throughput unblocking firehose with large data persistence to disk. >>>> Since >>>>> this is only one use case this by no means is saying Kafka is better >> than >>>>> Rabbit or vice versa. I think it is awesome there are more options to >>>>> choose from so you can pick the right tool for the job. Thanks open >>>> source! >>>>> >>>>> As always YMMV. >>>>> >>>>> >>>>> >>>>> On Fri, Jun 7, 2013 at 4:40 PM, Alexis Richardson < >>>>> alexis.richard...@gmail.com> wrote: >>>>> >>>>>> 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 >>>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>> >>>> >>