| ▲ | victorbjorklund 5 hours ago | |||||||||||||
For people that does not think it scales. A similar implementation in Elixir is Oban. Their benchmark shows a million jobs per minute on a single node (and I am sure it could be increased further with more optimizations). I bet 99,99999% of apps have less than a million background jobs per minute. https://oban.pro/articles/one-million-jobs-a-minute-with-oba... | ||||||||||||||
| ▲ | parthdesai an hour ago | parent | next [-] | |||||||||||||
Funny you mention Oban, we do use it at work as well, and first thing Oban tells you is to either use Redis as a notifier or resort to polling for jobs and just not notify. | ||||||||||||||
| ▲ | formerly_proven 4 hours ago | parent | prev | next [-] | |||||||||||||
This benchmark is probably as far removed from how applications use task queues as it could possibly be. The headline is "1 million jobs per minute", which is true. However... - this is achieved by queuing batches of 5000 jobs, so on the queue side this is actually not 1 million TPS, but rather 200 TPS. I've never seen any significant batching of background job creation. - the dispatch is also batched to a few hundred TPS (5ms ... 2ms). - acknowledgements are also batched. So instead of the ~50-100k TPS that you would expect to get to 17k jobs/sec, this is probably performing just a few hundred transactions per second on the SQL side. Correspondingly, if you don't batch everything (job submission, acking; dispatch is reasonable), throughput likely drops to that level, which is much more in line with expectations. Semantically this benchmark is much closer to queuing and running 200 invocations of a "for i in range(5000)" loop in under a minute, which most would expect virtually any DB to handle (even SQLite). | ||||||||||||||
| ||||||||||||||
| ▲ | 5 hours ago | parent | prev [-] | |||||||||||||
| [deleted] | ||||||||||||||