Each day, Pusher sends billions of messages in real-time: source to destination in less than 100ms. How do we achieve this? A key factor is Go’s low-latency garbage collector. Garbage collectors are a bane of real-time systems because they pause the program. So when designing our new message bus, we chose the language carefully. Go […]

Here at Pusher we’re always trying new approaches to web development and engineering to uncover ways of making our software more reliable. That’s why I’ve recently been using QuickCheck to fuzz test our Raft implementation with some great results. In this blog post, I want to demonstrate how this is an an effective technique for […]

Designing a good API for a library is a challenging problem. In Haskell getting the mix right between specialised and generic can be tricky. For example, just look at the controversy around FTP, where the functions that used to defined for Lists, were lifted to the Foldable and Traversable typeclasses. When designing a monadic API […]

In part two of my series on Haskell we spoke about identifying memory leaks and tuning the GC to improve performance. In part three we’ll be looking at a number of other techniques and libraries we have found that maximise efficient use of memory in Haskell when writing performance critical code. So without further ado. […]

At Pusher we are currently writing a high performance system in Haskell and blogging about it along the way. In our first blog post we explained some tools and tips that we have used for improving CPU time of our program. We’ve received requests for part two, so here it is. In this post we’re […]

One of the things that makes working at Pusher great is our appetite for building. We’ve created various internal tools, members of the team work on various open source projects — and of course, Pusher itself is designed to help others in this way. Alongside this, we also have regular HackDays, where we can take […]

(This blog post discusses CPU time profiling, but not space (memory) profiling. We’ll come back to that in a Part 2.) We use a range of different programming languages at Pusher and are always looking for ways to squeeze every bit of performance from them. Recently, I’ve been on a project to explore what other […]

The generally side-effect free nature of Haskell code makes it convenient to test. Haskell programs can interact with the outside world — otherwise they would be useless — but these side-effects are only possible in the IO monad. It is still important to test this code that performs IO, but we found it much more […]

A whirlwind of impressive hacks, great food, friendly people, a frighteningly tall CN tower, and beer. Yes, Jamie and I recently got the chance to represent Pusher at BattleHack Toronto! Jamie is a veteran of previous BattleHacks (London and Athens), but for me it was my first one, so needless to say, I was very […]

Those of you who use Pusher will know that the APIs we expose are small and straightforward to use. But this hides the complexity of what is going on behind the scenes. The sheer volume of messages (around 5 billion messages a day and approaching 1.25 trillion since we started counting) has necessitated a large, […]