SoftwareMill Blog
softwaremill.com · Company blog · on HN since 2013
SoftwareMill's engineering team writes about Scala, Java, message queues, and distributed systems, with benchmarks and code examples.
What HN saysHN links it for its message queue comparisons, Loom and Scala posts, and self-hosting write-ups, and one commenter calls the queue evaluation a great writeup.
55HN people shared it
13linked it in comments
140stories submitted
421story points
3 months agolast shared
2013people per year2026
Most-shared posts
- 1Evaluating persistent, replicated message queues (RabbitMQ/ActiveMQ/Kafka/SQS)5 people · 4 points · first shared 2015 · discussion on HN
- 2Will Project Loom Obliterate Java Futures?3 people · 9 points · first shared 2020 · discussion on HN
- 3Comparing Akka-Stream and Scalaz-Stream with Code Examples3 people · 8 points · first shared 2015 · discussion on HN
- 4GraalVM Installation and Setup on macOS3 people · 5 points · first shared 2019 · discussion on HN
- 5Stack Overflow’s mishap with self-reported data – tabs-vs-spaces debacle2 people · 8 points · first shared 2017 · discussion on HN
- 6Access Control System with Raspberry Pi, RFiD and AWS Rekognition2 people · 8 points · first shared 2017 · discussion on HN
- 7Amazon SQS: performance and latency2 people · 6 points · first shared 2017 · discussion on HN
- 8Abstractions and Serverless2 people · 5 points · first shared 2020 · discussion on HN
- 9Synchronous or asynchronous, and why wrestle with wrappers?2 people · 5 points · first shared 2018 · discussion on HN
- 10Kafka with selective acknowledgments performance and latency benchmark2 people · 5 points · first shared 2017 · discussion on HN
- 11Visibility Shift In Distributed Teams2 people · 4 points · first shared 2013 · discussion on HN
- 12Mistakes When Using Apache Cassandra2 people · 1 points · first shared 2019 · discussion on HN
- 13Understanding capture checking in scala2 people · first shared 2025
- 14Hiring Developers in a Remote and Distributed Company1 people · 56 points · first shared 2014 · 37 comments on HN
- 15Akka vs. ZIO vs. Monix, part 2: communication1 people · 34 points · first shared 2018 · 2 comments on HN
What HN people wrote when they linked it
thu2111 · 2020-10-07
Could you elaborate?
It's a great writeup. But I'm personally curious about them hitting the limits of vertical scalability. They said they used the biggest node 'available to them' without clarifying how big that was.
If the issue was RabbitMQ hitting resource limits then upgrading its hardware (or swapping it out for some other similarly featureful broker but which is faster) might have fixed some of the problems too, albeit not things like insufficient observability.
I also wonder to what extent RabbitMQ suffers from being written in Erlang. Switching to a featureful broker with sharding and replication that isn't Kafka e.g. Artemis might have allowed them to avoid rewriting code to not use helpful features.
This performance blog suggests RabbitMQ may top out at ~4000 messages/sec when making things durable, which isn't especially good performance:
https://softwaremill.com/mqperf/
noelwelsh · 2026-08-14
> Is java able to stackify most new Object calls and elide default initialization of object members these days?
Escape analysis in OpenJDK will stack allocate values where it can show it is safe to do so. Project Valhalla is also reducing the memory footprint of objects.
As for thread safety, that is more of a language concern than a runtime one. Amongst JVM languages Scala is leading here AFAIK. Its "capture checking"[1] provides thread safety (e.g. [2]) and actually covers escape analysis as well. On Scala Native (the native code backend for Scala) capture checking can be used for safe stack allocation and safe arena allocation.
[1]: https://docs.scala-lang.org/scala3/reference/experimental/cc.html
[2]: https://softwaremill.com/understanding-capture-checking-in-scala/
still_grokking · 2025-12-08
Scala is broadly used by the biggest companies in existence.
https://business4s.org/scala-adoption-tracker/
The stuff currently cooking in Scala 3 will once more revolutionize the whole programming language landscape.
https://softwaremill.com/understanding-capture-checking-in-scala/
https://www.youtube.com/watch?v=p-iWql7fVRg
pancsta · 2025-10-02
Every company is for profit. OpenAI was a “non-profit”. “Worse” and “good enough” can be true at the same time. Selfhosting signal is inferior to selfhosting matrix [0].
[0] https://softwaremill.com/can-you-self-host-the-signal-server/
swsieber · 2025-04-07
While I get how that's like git, it sounds even closer to unison:
https://softwaremill.com/trying-out-unison-part-1-code-as-hashes/
stickfigure · 2025-02-19
If that's true, you managed to do much better than these folks:
https://softwaremill.com/mqperf/
Maybe you should write a letter?
memset · 2024-06-30
I have looked at elasticmq but not played with it myself. You might also be interested in their benchmarks of all of the existing queues out there: https://softwaremill.com/mqperf/
mrkeen · 2024-01-12
> Git sucks. Reason? It is entirely imperative.
A git repository is a persistent data structure [1]. Operations are typically append-only, requiring --force flags to do any in-place mutation.
> And, well, just like in C, there's no safety pillow - if you screw up a call, something simply goes pear-shaped.
Git is the safety pillow. When you screw up your code, you restore it with git. Article doesn't mention the reflog, which is the second safety pillow hiding under the first.
[1] https://softwaremill.com/persistent-data-structures-in-functional-prog…
AlexITC · 2023-01-29
It seems that you are mainly interested in how to build preview environments for your app, these posts describe an approach to get there:
- https://softwaremill.com/preview-environment-for-code-reviews-part-1-c…
- https://softwaremill.com/preview-environment-for-code-reviews-part-2-c…
- https://softwaremill.com/preview-environment-for-code-reviews-part-3-r…
While the examples use Gitlab, it shouldn't be very hard to port the same idea to a Bitbucket.
olivermrbl · 2022-12-29
Yes indeed. Attaching below a couple of references from my exploration:
Transactional outbox pattern:
- https://microservices.io/patterns/data/transactional-outbox.html
- https://softwaremill.com/microservices-101
- https://brandur.org/job-drain
A pattern similar to the one I mention using cache:
- https://masstransit-project.com/articles/outbox.html
rr808 · 2022-02-06
Up to a few years ago java couldn't see the correct size of memory allocated to the container. https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd5…
leoh · 2019-09-16
I found this helpful for getting going with OpenJDK 8/Graal on Mac OS X (but the instructions are highly applicable to Linux as well).
https://blog.softwaremill.com/graalvm-installation-and-setup-on-macos-…
imadeamistake · 2021-08-24
Cassandra won't try and load a partition into memory. It doesn't work that way. The only way you would get behavior like that is by setting "allow filtering" to on. Allow filtering is a dedicated keyword for "I know I shouldn't do this but I'm going to anyway". If you're trying to run those types of queries, use a different database. If someone is making you use a transactional database without joins for analytical load, get a different job because that's a nightmare.
Also, your partitions should never get that large. If you're designing your tables in such away that the partitions grow unbounded, there's an issue. There are lots of ways to ensure that the cardinality of partitions grows as the dataset grows. And you actually control this behavior by managing the partitioning. It's really easy to grok the distribution of data in on disk if you think about how it's keyed.
You've basically listed a bunch of examples of what happens when you don't use a wide columnar store correctly. If you're constantly fixing downed nodes, you're probably running the cluster on hardware from Goodwill.
This is a pretty good list of what not to do with Cassandra, or any similar database.
https://blog.softwaremill.com/7-mistakes-when-using-apache-cassandra-5…