Anything Can Be a Message Queue If You Use It Wrongly Enough (2023)
Key topics
The tongue-in-cheek assertion that "anything can be a message queue if you use it wrongly enough" sparked a lively discussion, with commenters playfully riffing on the idea that even seemingly unrelated systems can be repurposed as message queues. Some wryly observed that online comment sections, like the one they were participating in, could be viewed as makeshift message queues, with latency being a notable drawback. As the joke gained traction, commenters chimed in with humorous takes, from acknowledging the "ueue" in "queue" to poking fun at the idea of treating a comment section like a message queue. Amidst the levity, a few astute observers noted that, in a sense, a message queue is just a database being used in a particular way – a clever insight that underscored the original claim.
Snapshot generated from the HN discussion
Discussion Activity
Very active discussionFirst comment
60m
Peak period
54
0-6h
Avg / period
9.3
Based on 65 loaded comments
Key moments
- 01Story posted
Aug 28, 2025 at 11:14 AM EDT
4 months ago
Step 01 - 02First comment
Aug 28, 2025 at 12:13 PM EDT
60m after posting
Step 02 - 03Peak activity
54 comments in 0-6h
Hottest window of the conversation
Step 03 - 04Latest activity
Aug 31, 2025 at 3:26 AM EDT
4 months ago
Step 04
Generating AI Summary...
Analyzing up to 500 comments to identify key contributors and discussion patterns
Want the full context?
Jump to the original sources
Read the primary article or dive into the live Hacker News thread when you're ready.
I don't have fun examples with message queues, but I do remember some with filesystems - a popular target to connect cursed backends to. You can store data in Ping packets [0]. You can store data in the digits of Pi - achieving unbelievable compression [1]. You can store data in the metadata and other unused blocks of images - also known as steganography [2]. People wrote software to use Gmail emails as a file system [3].
That's just from the top of my head, and it really shows that sky's the limit with software.
[0] https://github.com/yarrick/pingfs
[1] https://github.com/ajeetdsouza/pifs
[2] https://en.wikipedia.org/wiki/Steganographic_file_system
[3] https://lwn.net/Articles/99933/
On a related note, have you seen the prices at Whole Foods lately? $6 for a packet of dehydrated miso soup. This usually costs $2.50 served prepared at a sushi restaurant. AWS network egress fees are similarly blasphemous.
Shame on Amazon, lol. Though it's really capitalisms fault, if you think it through all the way.
Even with the massive margins, cloud computing is far cheaper for most SMEs than hiring an FTE sysadmin and racking machines in a colo.
The problem is that people forget to switch back to the old way when it’s time.
And the only viable answer is the ol’ capitalist saw: they charge what buyers are willing to pay.
That never quite satisfies people though.
Now every developer also has to be DevOps, learning docker, kubernetes and CI systems instead of just focusing on development.
Also we all still have ops teams.
If your scale requires it, that's fine, but that would have been the case with or without AWS et al.
Edit: And by people with too much money, which was until recently most tech companies.
That very much depends on your use case and billing period. Most of my public web applications run in a colo in Atlanta on containers hosted by less than $2k in hardware and cached by Cloudflare. This replaced an AWS/Digitalocean combination that used to bill about $400/mo.
Definitely worth it for me, but there are some workloads that aren’t worth it and I stick with cloud services to handle.
I would estimate that a significant amount of services hosted on AWS are paid for by small businesses with less reliability and uptime requirements than I have.
Amazon Video’s original blog post is gone, but here is a third party writeup. https://medium.com/@hellomeenu1/why-amazon-prime-video-rever...
It couldn’t possibly be because AWS execs were pissed or anything… /s
> The main scaling bottleneck in the architecture was the orchestration management that was implemented using AWS Step Functions. Our service performed multiple state transitions for every second of the stream, so we quickly reached account limits. Besides that, AWS Step Functions charges users per state transition.
> The second cost problem we discovered was about the way we were passing video frames (images) around different components. To reduce computationally expensive video conversion jobs, we built a microservice that splits videos into frames and temporarily uploads images to an Amazon Simple Storage Service (Amazon S3) bucket. Defect detectors (where each of them also runs as a separate microservice) then download images and processed it concurrently using AWS Lambda. However, the high number of Tier-1 calls to the S3 bucket was expensive.
They were really deeply drinking the AWS serverless kool-aid if they thought the right way to stream video was multiple microservices accessing individual frames on S3...
I would guess this was part of a process when new videos were uploaded and transcoded to different formats. Likely they were taking transcoded frames at some sample rate and uploading them to S3 where some workers were then analyzing the images to look for encoding artifacts.
This would most likely be a one-time sanity check for new videos that have to go through some conversion pipelines. However, once converted to their final form I would suspect the video files are statically distributed using a CDN.
"Something amusing about this is that it is something that technically steps into the realm of things that my employer does. This creates a unique kind of conflict where I can't easily retain the intellectial property (IP) for this without getting it approved from my employer. It is a bit of the worst of both worlds where I'm doing it on my own time with my own equipment to create something that will be ultimately owned by my employer. This was a bit of a sour grape at first and I almost didn't implement this until the whole Air Canada debacle happened and I was very bored."
It's tempting to roll your own by polling a database table, but that approach breaks down- sometimes even at fairly low traffic levels. Once you move beyond a simple cron job, you're suddenly fighting row locking and race conditions just to prevent significant duplicate processing; effectively reinventing a wheel, poorly (potentially 5 or 10 times in the same service).
A service like SQS solves this with its state management. A message becomes 'invisible' while being processed. If it's not deleted within the configurable visibility timeout, it transitions back to available. That 'fetch next and mark invisible' state transition is the key, and it's precisely what's so difficult to implement correctly and performantly in a database every single time you need it.
In practice, I've never seen this implemented correctly in the wild- most people don't seem to care enough to handle the transactions properly. Additionally, if you want additional features like DLQs or metrics on stuck message age, you'll end up with a lot more complexity just to get parity with a standard queue system.
A common library could help with this though.
Now if SQS has some super-scalar mega-cluster capability where one instance can deliver 100 billion messages a day across the same group of consumers, ok, I'm impressed, because most MQ's can't, because... locking. Thus Kafka (which is not a message queue).
I think the RDBMS MQ should be treated as the "No worse than this" standard - if my fancy new message queueing product is even harder to set up, it isn't worth your trouble. But SQS itself IS pretty easy to use.
Message-submitting clients used SMTP libraries. Message-consuming clients used Exchange APIs. Consumers would only look at unread messages, they would mark messages as read when they started processing, and move them to a folder other than the Inbox if they succeeded. Many of the queues were multi-producer, but all queues were single-consumer (CPUs were pricey at the time - our servers were all Pentiums and Pentium Pros), which simplified things a lot.
Need a new queue / topic? Add an email address. Need to inspect a queue? Load up an email client. An unexpected benefit was that we could easily put humans in the loop for handling certain queues (using HTML in the messages).
It worked surprisingly well for the 5 years that the company was around. Latency was okay, but not great. Throughput was much better than we would have hoped for - Exchange was almost never the bottleneck.
Oh good, I was worried about what would have happened if a rogue server accidentally hit "reply all"
I asked if the messages were all under 1.5kb, he said yes. I asked if at-most-one delivery was ok, he said yes. So I proposed he just grab a router and fire messages through it as UDP packets, then use BGP/ECMP to balance the packets between receivers. Add some queues on the router, then just let the receivers pick up the packets as fast as they could. You'd need some kind of feedback to manage back pressure, but ¯\_(ツ)_/¯
A fairly cheap way to achieve 1M+ messages per second.
I never got the chance to flesh-out the idea fully, but the simplicity of it tickled me. Maybe it would have worked, maybe not.
UDP message delivery order is not guaranteed. Hell, UDP delivery itself is not guaranteed (although IME, messages don't usually get dropped unless they cross subnets).
> I asked if at-most-one delivery was ok, he said yes.
Use case satisfied.
>> I asked if at-most-one delivery was ok, he said yes.
> Use case satisfied.
No. https://wiki.wireshark.org/DuplicatePackets
"ConnectionlessProtocols such as UDP won't detect duplicate packets, because there's no information in, for example, the UDP header to identify a packet so that packets can be recognized as duplicates. The data from that packet will be indicated twice (or even more) to the application; it's the responsibility of the application to detect duplicates (perhaps by supplying enough information in its headers to do so) and process them appropriately, if necessary"
Nope. This is what "at-most-one" means. Either zero or one. Not two.
Three is right out.
> you also assume there is no other identifying info inside the packets that might provide an inherent protection anyways
Yes, but then if we're positing a system on top of UDP, then it doesn't matter what the protocol is, TCP or UDP. We can also assume the underlying system we're relying on can also detect missing requests, or even ensure we have exactly one.
But "is at-most-one ok?" doesn't necessarily mean that more is also unacceptable. All the valid and invalid conditions are not completely specified IMO.
If you propose delivering an at-most-once solution, the customer agrees that that is an acceptable parameter, and then you deliver a solution that has no at-most-once guarantee, you haven't delivered what you proposed, and you certainly have no reason to believe you've met the customer's needs.
> if we're positing a system on top of UDP, then it doesn't matter what the protocol is
And this is still true, and neither of us know if they would have designed it this way or not, but they could.
But given OPs need for at-most-once, this doesn't really seem to matter in the first place.
My thinking was that ordering would be pretty unaffected when there is only a single hop. But yeah, we would have needed to test that under load.
Anything can be a message queue if you use it wrongly enough - https://news.ycombinator.com/item?id=36186176 - June 2023 (239 comments)