Panel: The Past, Present and Future of Background Jobs
See all speakers
See all 4 speakers


Summarized using AI

Panel: The Past, Present and Future of Background Jobs

Ben Sheldon, Mike Perham, Rosa Gutiérrez, and Maciej Mensfeld • July 09, 2025 • Philadelphia, PA • Panel

Introduction

This panel discussion, held at RailsConf 2025, brings together the lead maintainers of four prominent Active Job backends in the Ruby on Rails ecosystem: Mike Perham (Sidekiq), Rosa Gutiérrez (Solid Queue), Maciej Mensfeld (Karafka and Shoryuken), and Ben Sheldon (GoodJob). The session explores the evolution, philosophy, technical approaches, challenges, and community aspects of background job systems in Rails.

Key Points Discussed

  • Origins and Unique Features of Each System:

    • Each panelist describes the motivations behind their system, ranging from technical inefficiencies observed in existing tools (like Rescue's memory usage) to organizational needs and personal interests in new technologies such as Kafka.
    • Specific architectural choices were highlighted, such as Sidekiq’s reliance on Redis, Solid Queue’s adoption as the new Rails default using various databases, Karafka’s extension beyond job processing into streaming, and GoodJob’s focus on a multi-threaded PostgreSQL backend.
  • Community and Commercialization:

    • The discussion touches on the significance of commercial offerings (e.g., Sidekiq Pro/Enterprise, Karafka Pro) and the community's acceptance of paid versions, which help maintainers sustain and evolve their projects over many years.
  • Major Surprises and Evolving Visions:

    • Panelists noted shifts in original visions, such as rethinking transactional guarantees, expanding from minimal implementations to feature-rich offerings, and encountering unexpected community needs.
    • Technical challenges like support for multi-threading in Ruby (impacted by the Global Interpreter Lock) and difficulties in delivering highly concurrent and reliable systems were recurring themes.
  • Common Misconceptions and User Struggles:

    • Misunderstandings around system dependencies (e.g., reluctance to add Redis), database configuration, and confusion about job queue naming conventions (advocating for latency-based naming) were discussed.
    • Documentation challenges and the importance of clear developer UX surfaced as ongoing issues.
  • Future Directions and Wishlist for Ruby and Rails:

    • Hopes for Ruby’s concurrency model to improve, with better support for Ractors and eventual removal of the GIL.
    • A desire to see Rails' Active Job evolve, incorporating features like improved concurrency and broader event-driven architectures.
    • Mention of opportunities for new libraries, especially in observability, monitoring, alerting, workflow tooling, and async integration—spaces considered essential for modern applications but under-developed in Rails.
  • Audience Q&A Highlights:

    • Addressed best practices for ensuring critical jobs are reliably enqueued despite the move to after-commit, including suggestions for logging, alerting, and transactional outbox patterns.
    • Panelists shared insights behind their projects’ naming conventions and discussed lessons learned from trademark issues.
    • Reflected on patterns from outside Ruby (like event-driven architecture) that could further benefit the ecosystem.

Main Takeaways

  • Ruby on Rails boasts a rich ecosystem of background job backends, each offering varying philosophies and technical strengths.
  • There is ongoing tension between simplicity, feature sets, performance, and community/user expectations.
  • Sustaining open source projects increasingly relies on commercial support and active community engagement.
  • Significant opportunities exist in improving developer experience through better observability, monitoring, and workflow tools in the Ruby/Rails landscape.
  • Evolving Ruby's concurrency model and expanding Active Job’s capabilities are key priorities for future development.

Panel: The Past, Present and Future of Background Jobs
Ben Sheldon, Mike Perham, Rosa Gutiérrez, and Maciej Mensfeld • Philadelphia, PA • Panel

Date: July 09, 2025
Published: July 23, 2025
Announced: unknown

Join a discussion between Sidekiq’s Mike Perham, Solid Queue’s Rosa Gutiérrez, Karafka and Shoryuken’s Maciej Mensfeld, and GoodJob’s Ben Sheldon.

This panel hosts the maintainers of the four most well-known Active Job backends. They’ll discuss and reflect on their different approaches, philosophies, capabilities, and challenges to powering background jobs and integrating with Active Job.

The discussion will cover a range of topics including performance, feature-sets, support, commercialization, regrets, visions of the future, questions from the audience, and more!

RailsConf 2025

00:00:19.760 present, and future of background jobs. Uh, according to Mike. Oh my god, we're
00:00:25.920 in order. Mike, Rosa, Magic, and I'm Ben. Um, so just agenda wise, um, we
00:00:34.320 want to try to do about 30 minutes of canned questions and then, uh, really
00:00:40.160 open it up to the audience for the last half of it. Um, so I'm just going to jump into questions as part of our
00:00:46.879 introduction. So, uh, if we could introduce ourselves and the job systems
00:00:52.160 that we work on and what do you think makes them unique or different from the
00:00:57.600 rest of us? Um, I'll start with you, Mike. Thank you, Ben. I'm Mike Pam. I am the
00:01:04.000 author and maintainer of Sidekick. Uh, I also have a business around Sidekick, selling Sidekick Pro and Sidekick
00:01:10.400 Enterprise. Um, what makes my job system unique? I think uh I'm the only one up
00:01:15.439 here that depends on Reddus. So I use Reddus. I like Reddus. Uh it's a extremely useful data store and uh it's
00:01:23.280 really good at building a job system uh or powering a job system.
00:01:30.799 Okay. Hi everyone. I'm Rosa. Uh I'm the author and maintainer of Solid Q. Um I
00:01:38.479 think what does what makes Solid Q different right now? Um before my go-to
00:01:45.280 answer was that it uses a database but that is no longer unique here. So I will
00:01:50.399 say it's the current default in Rails and it's it can be used with uh
00:01:58.159 different databases like currently we support my SQL possess and SQL light. So
00:02:04.079 yeah I have my own. Hi guys. Um, I'm Magic.
00:02:09.599 I'm the creator of Karafka, which is the Kafka Ruby framework, and the newly appointed maintainer of Shyukan, which
00:02:15.760 is the AWS SQS1. So, I'm representing myself uh and a bit of a representing
00:02:21.440 Pablo, the creator of uh Shyukan. What makes my uh job systems unique? Uh yeah,
00:02:30.480 first of all I think that in terms of uniqueness, Karafka is more than a job
00:02:36.959 execution system. Uh so that's that's definitely something that makes it unique because it provides like
00:02:43.200 capabilities beyond uh worker or job execution and uh what makes Shyukan
00:02:50.400 unique? I think one of the things that make it unique is that the fact is that it is a really old fork of Sidekick. Uh
00:02:57.120 really old. Uh Mike fixed all of the issues that I now have to fix as a newly appointed maintainer. Uh
00:03:03.440 you're maintaining my code. Yeah, in a way. In a way. Yeah. Uh yeah, but what I also think is really unique
00:03:09.760 is that it was almost abandoned. Uh I took it over and if there are any users
00:03:15.920 of Shyukan, please ping me because I need to re rebuild the community from the ground.
00:03:23.040 Um hey everybody. Uh Ben Sheldon. I'm the author of Good Job. Good job is a
00:03:28.959 multi-threaded Postgress based uh active job system. Um I'm like wow I think
00:03:34.159 there's less unique stuff than if I had given this uh two years ago. Um but it's Postgress specific. So it uses some
00:03:41.440 Postgress features. Uh it uses listen notify I use advisory locks um for them.
00:03:48.319 And yeah, uh I'm going to move to my next question, which was uh if you try
00:03:53.840 to remember back, um for each of you, uh was there some sort of event or
00:03:58.959 motivation that caused you to like actually build these things in the first place?
00:04:06.400 Uh yeah, there was uh I was working as a consultant uh with a client that had a
00:04:11.519 pretty large installation of rescue and rescue is singlethreaded. So you
00:04:18.160 fork a process for every job and they were trying to run thousands of jobs. So they had thousands of multi- gigabyte
00:04:25.199 processes and it was just taking an insane amount of RAM. Uh and that's where I said maybe multi-threading would
00:04:33.120 really help here. Uh since you can share the memory amongst jobs and that's where
00:04:38.320 the um uh the the core of Sidekick, the idea of Sidekick came from. Um,
00:04:46.800 was that the answer to the question or was there more to the question? I think that was the question. All right.
00:04:54.000 Yeah, my answer is uh not as nice. I suppose in my case, what motivated
00:05:00.160 building solid Q was that David has this had this idea for it and he paid me to
00:05:06.080 do it. I work for 37 signals, so he's my boss and so this was a project I got. Um
00:05:13.120 but actually what motivated it in the first place was that we use res we use
00:05:18.240 rescue for most of our apps. Rescue is is really I I like it a lot personally but uh as as Mike said uh we had
00:05:25.600 problems with the multi-threading stuff. We have to run multiple processes. We have a lot of uh custom gems that we
00:05:33.199 built to overcome some of the son of rescues limitations and it had become
00:05:39.360 pretty complicated. So when we started a new app and uh we saw that we had been
00:05:46.320 um porting like bringing the the seven gems or so that we had and a lot of
00:05:51.840 customs that for rescue over and over to every app they David wanted something
00:05:57.039 that just work out of the box in a much simpler way and we decided to start
00:06:03.840 something from scratch now with all with everything that we've learned from running many running jobs in many
00:06:11.360 different apps. Yeah, I have a really simple answer to
00:06:16.960 this question. Hyperdriven development, you know, like my friend came to me, he's like, "Hey, there's this new thing
00:06:23.199 called Kafka. Uh, do you want to use it?" And obviously I didn't want to do the business logic of the company I
00:06:28.479 worked for. Uh, so I I needed to find a reason. Uh, so I built Karafka exactly
00:06:34.319 for that reason. Um, there was like a really low-level driver. Uh but it it's
00:06:40.000 development experience was bad and instead of trying to convince people that we could actually use it, I just
00:06:45.440 wanted to wrap it around. Uh and for sure you can uh I think I can speak on
00:06:52.000 behalf of Pablo. You didn't want to accept a plug-in for AWS SQS, so he just
00:06:58.000 forked that uh pretty much. So it's all on you. Yeah.
00:07:05.280 Uh with good job. I think the I really wanted something that I could run on
00:07:11.039 Heroku. This was back when there were free dinos that would like be able to run um in a web process. And there was
00:07:17.840 another job q system called qe that I really liked. And that's sort of like
00:07:23.599 the maintainership of that um was sort of absent. And I I was like for a hot
00:07:31.440 minute I was like maybe I could be the maintainer of this. And I looked at the code and I was like this is way too complex for me. Um, and I sort of had an
00:07:39.440 experience at work where I was doing stuff with advisory locks and I was doing stuff with concurrent Ruby and I was like, "Oh, it would be really,
00:07:44.960 really, really simple to just like put these things together um, and have
00:07:50.000 something that I could just like run in the Puma web process on a cheapo Heroku
00:07:55.680 dyno." Uh, and that was sort of how it started. Uh, so I'm going to ask my next
00:08:01.759 question, which was, um, so that was how things started. uh now where we are
00:08:07.440 today um over your experience of like developing and supporting uh your system
00:08:12.879 or systems like what has most surprised you um or what has sort of changed from
00:08:19.120 your original vision or motivation if anything? I yeah I'm struggling with this question
00:08:24.960 a little bit. Um I'm a little bit of an odd bird here because I have a business built around a
00:08:31.199 Ruby gem and there's not a lot of people in the world that have that. Uh, there's one more here.
00:08:36.880 Fair enough. Fair enough. 50% of this. Oh, yeah. There's there's a couple of people selling pro versions. Um,
00:08:43.279 but uh I'm I'm just happy that the community by and large accepted that. Um, because it really makes me able to
00:08:50.480 m, you know, I've been maintaining Sidekick for 12 years now. There's no way I'd be able to do that if I was if I
00:08:55.519 was working uh for free uh to put in all the hours and all the polish that I've put into it. So I I'm happy that the
00:09:03.040 community by and large accepted um my commercial offerings.
00:09:10.640 Um yeah, for me the the the biggest so the biggest surprise or the biggest
00:09:19.200 change from the initial vision for sure was to um renounce to to give up the
00:09:27.200 transactional integrity when queuing jobs like this is something I remember I've discussed in issue or pull request
00:09:34.000 or whatever with them because I lied a lot uh like using the database to store
00:09:41.120 jobs. One of the things I liked the most in the beginning uh was that you could
00:09:46.399 use like if you store your jobs with your data in the same database and you could use transactions to ensure like
00:09:52.560 for example if the job fails to be encued you roll back the the other data
00:09:58.240 or things like we we had some problems uh in the past when we assumed that the
00:10:04.560 job was going to be encued no matter what and then we made assumptions on that but sometimes you commit something
00:10:11.519 to the database you inque a job and maybe ready is down when we were back using rescue and so you need to manually
00:10:18.000 roll back the other data this kind of things so I was since I have deal deal with incidents around that in the past I
00:10:26.000 was very excited about that so in the beginning I built the whole thing around this you know assuming I will have this
00:10:33.360 but then uh rails core were very much against this this this this way this
00:10:41.360 this uh feature. Um I think it was because they some people in their score
00:10:47.120 used to have h used to use delayed job and they were inadvertently relying on
00:10:54.399 this transactional integrity for some things and when they mig migrated to a
00:10:59.519 different system they they had a lot of bugs there. So they were traumatized by that. I understand I've been traumatized
00:11:05.519 by job problems as well. So they had this very strong opinion on not having
00:11:11.760 this by default. So I have to change that and in the end I have to change it anyway because we have to move to a different database. But the thing is
00:11:18.160 that it was completely uh 180 um turn
00:11:24.720 from what I wanted to do in the beginning and yeah and pretty much embraced the not relying on
00:11:31.600 transactional integrity. Even even now with added job by default I think jobs
00:11:36.720 are incued after commit uh so after all transactions are committed even even if you encue them in the middle and so yeah
00:11:43.600 that'll be it okay uh for me uh few things actually
00:11:50.000 there's like part of this question that wasn't read technically socially or anything right so socially I'm quite
00:11:56.959 quite optimistic about how people accepted the pro version of my software
00:12:03.680 uh this made all the difference for me and how much I time I can invest and how
00:12:09.360 good of a quality of software I can provide when I have resources to do that. Uh what surprised me also and it
00:12:16.560 still keeps surprising me is that a lot of majority of Rails or Ruby community still don't understand how good
00:12:22.079 ecosystem we have for Kafka actually how way ahead we are in terms of like developer experience and many other
00:12:28.160 things compared to any other language there is uh and for sure you can uh I
00:12:35.279 don't have a vision for it yet a huge vision uh what surprises me is that how
00:12:41.519 old-fashioned it is and how much work Mike did uh since the fork. Uh and the
00:12:47.519 fact that it doesn't have a UI. This is a big problem for uh working with it and
00:12:53.920 operating it is like yeah unacceptable. I'm going to fix that.
00:13:00.160 Uh with good job. I think the thing that surprised me the most was how much else
00:13:08.160 people wanted from it. that like when I originally like I said I was like oh
00:13:13.360 it's just concurrent Ruby and a Postgress query and it was like I think the first version was like 500 lines of
00:13:18.880 code and it was just background jobs and then like you know I'm glad people started using it but like almost
00:13:24.959 immediately people were like oh we also need like cron like scheduling and then people wanted batches people wanted uh
00:13:33.760 the concurrency controls and I was very sort of just like no it just does
00:13:40.480 background jobs. Uh, and sort of like held the line. Uh, but I was sort of like I guess I was convinced. And I
00:13:47.440 think the the piece was just like, okay. Um, like I say, like my target was
00:13:53.200 really people that wanted to just run a cheap website and do it well and
00:13:58.800 realizing just like, oh, actually, if you want to not do it perfectly, but just like do it well, do a good job of
00:14:05.199 it. um that there was yeah there was other uh other components that I did
00:14:12.079 sort of come around to realize and like no you actually do sort of like definitely chronike jobs um and now I
00:14:18.560 think good job is like 20,000 lines of code and some parts of it I am much less happy about the implementation with than
00:14:25.360 that that pristine 500 lines of code. Um, but I guess like just sort of like
00:14:30.720 once you start on that path, um, I guess maybe Mike, this is something you've been doing sidekick forever that it's
00:14:36.639 like people just there are there is more that you can always be doing to make it better. And I was, yeah, surprised by
00:14:43.440 that. One of the hardest parts of maintaining a large system like you say, Ben, is
00:14:49.839 having a vision and sticking to that vision. And if people do ask for functionality like you say,
00:14:58.079 melding it into something that would fit into your vision or alternatively saying
00:15:03.199 no, right? Sometimes it's really hard to say no but you have to. Um I have a a
00:15:09.519 third position which is I can say you've got to pay me for it, right? So that's the other thing is is if it's if it's hard the batches API the
00:15:17.760 batches API in Sidekick Pro was really hard to develop. It took me probably five years before I got that API
00:15:24.079 stabilized. Um, and so I'm I'm I have no um qualms about making that a commercial
00:15:31.360 API because it was just really hard to build. You can always tell them to pay and then
00:15:36.399 then say no. You know that that's true too. Wonders of free markets.
00:15:43.519 All right, this is the the spicy question. Um, what do you think uh
00:15:49.120 people get most wrong or misunderstand uh or require the most handholding or you just wish that people like did
00:15:55.199 something differently? Uh, yeah, I think the one of the biggest
00:16:03.519 blockers for sidekick usage is it's just reliance on Reddus. I think a lot of people uh are comfortable, they
00:16:10.320 understand that they're going to need a database. Um but then they ask themselves why do I want to run Reddus
00:16:15.600 too? I I think it in itself has a lot of value as a data structure server. Uh
00:16:21.199 applications can really build a lot of interesting functionality on top of the building blocks that uh Reddus gives
00:16:27.360 you. Um you know I built a job server on top of the the building blocks that Reddus gives me. Um but I I think people
00:16:35.440 are a little hesitant to try Reddus and really it's incredibly stable. It's
00:16:41.199 incredibly fast. I I love that software and a lot of people do too. But uh I I
00:16:46.639 would just encourage people if they've never tried Reddus before to to give it a give it a try and and maybe read
00:16:52.000 through the documentation and and see uh if it maybe gives them ideas for interesting or novel ways to solve
00:16:58.160 problems they're having in their app. Yeah. And a plus one to that. I love
00:17:04.799 Reddis. It's so nice. It's such a great piece of software. Um, for me, I think I
00:17:10.959 that was also a big surprise for me. The the thing that people that takes the most work and and people seem to
00:17:19.439 struggle the most is that so when with solid Q we use uh by default it uses
00:17:26.799 different databases a different database from your app. So we uh you need to set
00:17:31.919 up to to set a different database um for rails and rails support this uh by by
00:17:38.720 like it's built in in rails and and then solid q doesn't have a m doesn't have
00:17:44.880 migrations. It just use a schema file to load the database because it's just
00:17:50.720 starting the schema file. Um but for some reason first we uncover a few bugs
00:17:58.160 in the in rails multi database handling because it seems that before solid Q and
00:18:04.080 solid okay that's yes solid Q and solid cache started setting multiple databases
00:18:11.440 people weren't using this very much I think because there was a few bugs that were uncovered after we we um released
00:18:19.280 the first version with this and people starting using it. That was one thing. But even after fixing those, um, people
00:18:26.799 really want to run migrations for it. And you don't need to run migrations because there are no migrations and you
00:18:33.280 just need to to load the the the database, the schema file with Rails. It's just a command. But I still get
00:18:39.919 questions almost every week about why the migrations are not running. And I I
00:18:45.200 don't know. It's it's true that it's a little bit odd. Um, but I I I I don't
00:18:52.960 know. I thought it was clear like in the rhythm and everything. But yeah, it's it's the thing that people struggle the
00:18:58.720 most just setting it up and getting the database ready.
00:19:04.960 Maybe that's because you Rails has engines, right? And they have migrations. So that I I think the
00:19:10.559 natural expectation would be you plug something in and it operates on a database. So you should have a
00:19:16.480 migration, right? just add one and you you'll not have any more questions. Uh now you know
00:19:24.240 now it just become a matter of because it works with the schema is the same. You just need to prepare the database
00:19:30.400 run DB prepare load the schema as you will do with a new database and I agree like if I could just add a migration
00:19:36.400 yeah just one just one but now I'm now anyone you know no now I will die on this hill like now
00:19:42.240 the schema works now I I'm just it really works it works like you can just
00:19:47.679 use it I'm not going to create a migration because there is nothing to migrate there is just a new database you
00:19:53.679 can just load the schema and it works it works
00:19:58.799 Okay. Uh let's just keep it. Uh for me uh one of the bigger
00:20:05.760 misconceptions uh that I'm trying to fight with is that people are using Kafka as a message Q as a job queue only
00:20:13.360 which is not its primary usage. Yes, I build an active job support for it. Uh because people do use it but it
00:20:19.120 shouldn't be the primary case. So if you're thinking about uh using it just to run jobs then don't pretty much uh I
00:20:27.039 spend a lot of time and the second thing is uh no one reads the documentation you know I I have beautiful dogs uh no one
00:20:35.039 reads them uh which makes me really really sad and uh this requires a lot of
00:20:41.600 handholding to teach people that uh I am writing docs for a reason uh and then
00:20:47.120 reason is basically the users uh for sure you can. Uh I don't know yet. Uh I
00:20:54.559 I think that what people got wrong with it is that the expectation that the
00:20:59.840 maintainers will do everything for free. They will never burn out and they will be happy just by you know getting stars
00:21:05.280 and giving those stars to their children to eat. Uh so yeah I I think people get
00:21:11.760 that wrong. I think on my side um this I wrote this
00:21:18.320 question for me to have a soap box um because I have a very strong opinion which is uh you should name your job
00:21:25.440 cues based on latency not on uh like what they do. So don't
00:21:32.159 have a mailers cue. Have a 30 second latency queue uh for the emails that
00:21:39.360 you're like really want to go out quick like a reset password email. Uh, and then have a like 10 minute latency or 1
00:21:47.200 hour latency or whenever latency. That's what I call mine for like your bulk
00:21:52.640 email like mailer. Uh, if you're emailing, it's like bulk where you don't actually care when it goes out as long as it just goes out. Um, but I see this
00:22:02.159 all the time of people just uh usually people this is uh was it where it's like
00:22:07.919 somebody asks one question but it's really because of a misunderstanding with something else where they're just like how do I do quality of service with
00:22:15.200 my mailers queue? Um and it's like well you don't you just have two separate
00:22:20.240 cues. Um, so please uh do latencybased
00:22:25.679 um organizing of your Q names. Please please do that. And shout out to Gusto. I believe they
00:22:32.159 popularized that that idiom. So thanks.
00:22:37.520 Uh all right. Um I'm skipping the question on the fold. Uh next one we've
00:22:44.480 got uh so if you look ahead 10 years, we're into the future part. Uh if you look 10 years into the future and
00:22:51.360 assuming that Rails and Ruby are still doing good, which we are assuming here, uh how do you imagine your background
00:22:58.880 job system might be different? 10 years sounds like a long time. Um
00:23:06.080 Sidekick has reached a a pretty good point of stability. Uh there's not a lot of new features going in. I did just
00:23:12.240 release an 8.0 know, with a couple new features, but um by and large, I'm not not seeing a lot of new features. It's
00:23:19.039 really dependent on the community. If you're using Sidekick and you want want something uh open an issue that, you
00:23:25.440 know, you're the driver really of the road map. Um but the the main, you know,
00:23:30.880 thing that sticks in my cross still is the gill. The gill really impacts the the um effectiveness of multi-threading
00:23:38.480 in Ruby. And so, uh, I've I've been trying to work with Ractors for a couple
00:23:44.720 years now, and they're they're slowly improving, but it's it's a long slog. Uh, you know, Python looks like they're
00:23:51.440 making progress getting rid of their gill, and and I hope at some point, uh, Ruby will will do the same.
00:24:00.159 Yeah. Uh, for me, 10 years, it feels like really long time because the
00:24:05.280 because Solid Q has been like one the 1.0 zero version uh doesn't even have a
00:24:11.919 a year. It's not even a year old. So 10 10 years salontentine. So I don't know
00:24:17.200 how much is going to change. It's still quite immature in some parts. So I I
00:24:23.760 will hope that it will mature and that some of the parts that I'm not super happy with especially around concurrency
00:24:32.159 controls that part I I'm not happy with the performance there. Um, I hope we
00:24:38.960 figure out how to improve that in future versions. And yeah, I just I suppose I I
00:24:45.120 will hope that it continues being praise default hopefully and and that we can
00:24:52.480 get it to a more like mature state. I I I guess and improving the
00:24:58.400 parts that aren't that great. it it's would it wouldn't ever be as performance
00:25:04.480 as performant as Sidekick or or Karafka or anything like not not at all. But at
00:25:10.799 least the parts that I know can can could use an improvement.
00:25:18.799 Yeah, I agree with Mike on on Gil on Raptors. I've been complaining a lot on
00:25:23.919 them for years. Opening issues uh being ghosted a bit as well. Uh yeah, we're
00:25:30.559 not there yet with them and uh I hope that well I really hope that in 10 years we will. Uh I would love for them to uh
00:25:39.760 start working as expected faster cuz I I don't think users code needs to be
00:25:44.799 bracking before and after the job execution uh
00:25:52.480 that could benefit greatly out of it. Uh I really hope that in in the context of
00:26:00.480 rails that we're going to get a abstraction on top of active job like active event something that is more
00:26:05.919 generalized to bring event- driven architecture to the rails community which has been in in my opinion mostly
00:26:11.600 entitydriven you know you have like a user.save user.update update. You don't have
00:26:16.799 batches. You don't have streams. Uh even with sidekick batches, people are just not used to elevating them in my
00:26:22.640 opinion. It's like, yeah, I just I'm going to spawn a job for every single user or whatever, right? Uh and in in
00:26:30.720 context of my things, I I really hope that in 10 years I'm going to I'm going to finish the show UI. Uh which probably
00:26:37.440 is going to look like Sidekicks. Uh which is how the first UI of Karafka
00:26:42.880 looked, right? I emailed you, can I steal the Sidekick's design? And I ask you, is is Sidekick's UI under LGPL or
00:26:50.960 or some sort of a copyright? And you just said, yeah, whatever. Yeah. All the code is LGPL in Sidekick
00:26:56.559 itself. Yeah. Yeah. So that's why it looked like that. Feel free to steal it. No, I did.
00:27:02.960 I did change it though. Uh after a guy that probably is here complained that it looks 2010. Uh
00:27:10.960 it served its purpose though. It's 2012. Thank you very much.
00:27:16.480 Yeah. Uh and in terms of uh Karafka, I I'm like 50% done with it. There's like
00:27:22.559 a lot of capabilities I didn't embrace yet cuz I haven't had time or uh they're
00:27:27.679 just less important than other things I've been doing. But uh yeah, I hope to bring many new capabilities. Kafka is
00:27:34.960 also evolving itself. uh the Apache team is working on cues on normal cues uh not
00:27:41.679 constrained by uh Kafka's technical like design limitations. So I hope to bring
00:27:47.279 that as well to the Ruby community. Yeah,
00:27:52.640 I think I'm really hopeful that active job uh gets developed. Um, when I
00:28:00.559 started Good job in 2020, um, like active job, like the active job
00:28:05.679 interface, the API, I think hadn't really been updated since it like was first released in whatever Rails 5
00:28:12.720 something. Um, so and like as I was sort of, like I said, like there's sort of I
00:28:18.960 imagined it being very simple and it has gotten a lot of features. Um, but these
00:28:24.880 are all things in good job and like I sort of from talking with Rails core people and I mean obviously we could
00:28:31.039 fill a stage with people with competing systems that active job itself is very
00:28:36.640 is sort of like the lowest common denominator of these backend job systems. And so I'm sort of like hopeful
00:28:44.559 now uh that especially with solid Q that we have like a firstparty
00:28:50.799 uh backend that active job will get more attention um and get a more interesting
00:28:58.240 API or potentially have like other features like concurrency actually built in. Um and I guess like I'll say I think
00:29:05.039 I'm starting to see that. Um, like I think there's some new discard hooks
00:29:10.640 that uh I think a Shopify engineer contributed. I saw continuations
00:29:15.840 uh that there's like some good features that are going to be I think in Rails 8.1. Um, and so like I'm starting to see
00:29:23.440 some of that ice break on active job. Um, and so like mostly I'm just excited
00:29:30.159 to see yeah more of these things where it's just like great for good job. I can just hook into make sure that I support
00:29:36.000 that rather than have to build it uh entirely inside of of my own back end.
00:29:43.360 All right, I have one more question before uh we're going to go to audience questions. Um, so I mentioned that like
00:29:50.480 we're able to fill a stage here with with four people that are all working on things that sort of are in the same
00:29:55.679 space. Um, where do you think there are opportunities for people who want to develop libraries with the same level of
00:30:01.760 importance as background job systems? Uh, so not within background jobs, but
00:30:06.960 is there anything that you wish somebody were to take uh and develop into a into
00:30:12.640 a library? No,
00:30:18.480 I don't know. I mean, if I if I had that idea, I'd probably build it myself. I mean, we're all engineers. Um, I I just
00:30:24.000 encourage people to scratch their own itch, right? That's that's why I created Sidekick because I I was literally the
00:30:29.440 first customer for myself. I wanted this system. Um, and so if you're if you're
00:30:34.960 using something and you see it as nonoptimal or you know a better way to build that mousetrap, um, do it. uh you
00:30:43.760 know in my case uh I had been doing open source for quite a while and so how to
00:30:50.320 how to build for the long term was very much on the front of my mind so uh
00:30:55.520 that's why I went the commercial direction and so you know you can obviously if you want to build something for fun in your spare time great but you
00:31:02.720 can also think about if you're building infrastructure that other people are going to rely on how are they going to
00:31:07.919 rely on you for the next decade uh what's going to keep you going Um, so,
00:31:13.919 uh, we each have our own motivators and so that that's where you really need to think about yourself and what motivates
00:31:19.200 you and what what would motivate you for the next decade to work on this project.
00:31:27.039 Yeah, it's a it's a tough question. I I think one thing that I not sure rails still
00:31:35.679 still has have has a good answer for is anything around monitoring and alerting
00:31:43.519 and that kind of thing like everyone does have to do their own and currently
00:31:50.240 like at 37 signals we we do a mix of Prometheus we use Graphana um we
00:31:58.640 have like different um ways to alert, but it's nothing that race doesn't help
00:32:06.399 in any way. I I wish there was something that you could just could just use. I
00:32:11.760 don't know if it's the same as maybe not the same as as a job back, but that
00:32:18.720 would be really really cool to have it provide by the framework.
00:32:23.919 Yeah, I agree with you like er error tracking generalized one that you could have in a database, right? Uh I think
00:32:30.960 there's a space for uh complex workflow tooling for Ruby and Rails, you know,
00:32:37.279 there there's like temporal there's a sidekick batches uh but they're not generalized. There's like pretty limited
00:32:44.960 I don't like the APIs of neither yours or acidic job. uh sorry but but I I
00:32:52.240 think that's uh you know we have our own expectations and I I think there's a big space there with being able to
00:32:58.640 understand how the workflows are executed having a really good de developer experience and I strongly
00:33:03.919 believe that if you if you build something that has a really good DX people will be first of all using it and
00:33:09.120 then at some point hopefully paying for it uh obviously there's the AI space you
00:33:14.880 know uh I kind of feel we're a bit behind it with with certain pieces of
00:33:20.559 tooling that we could nicely plug in and like utilize uh some of the quite useful
00:33:27.120 cap capabilities we could get out of that again with good developer experience and uh decent UI uh that's
00:33:36.080 and things related to async like I didn't mention it before but uh
00:33:42.480 stuff on top of what Samuel Williams is is doing for you know acing work that's like none of us embraced it yet. I I
00:33:49.120 feel uh and some of the things that LLMs require or how they work are actually
00:33:57.120 play really well with with the async reality. So I I think there's a huge space there as well. Can it be
00:34:03.120 commercialized? I have no idea. Uh because I strongly believe you have a you need to have a UI. Uh and only then
00:34:09.679 people like can justify the the expense. But yeah, but that that's my opinion. I
00:34:16.320 mean, I disagree with none of that because I think the the DX side um
00:34:22.879 having a nice UI like I think just like mentioning the the dashboard side of
00:34:28.240 like Sidekick as being really great that I think like you know I'm like what does good DX mean? um that I think a lot of
00:34:38.079 like good good libraries I really appreciate are ones like yeah that I can actually see it and use it and yeah
00:34:45.679 having a nice developer dashboard that's easy to set up like mount inside your Rails app. Um I'm going to keep pounding
00:34:52.800 on the I want to just run in a Heroku cheapo dynino. Um and yeah, especially
00:34:58.079 like uh this is me just asking for somebody to build this like the logging
00:35:03.760 um met logging metrics and exception monitoring just like that I could just
00:35:10.079 mount as an engine in my app put in my Postgress database um would be uh really
00:35:16.480 really nice um to have and I think those are the things too is just yeah the like
00:35:21.599 visibility into uh whatever the heck this library is doing uh is really
00:35:27.280 really valuable. All right, we are at perfect timing that
00:35:32.800 do we have any audience questions and do we have somebody that can run with a microphone to ask them
00:35:40.800 or even see because it's like Yeah. Do we have one more mic or should I
00:35:47.280 share mine now? Okay. No questions.
00:35:53.040 Yeah, there's one. Okay.
00:36:01.599 Um, since we're as a community kind of moving towards after commit as the way that we incue jobs, which makes sense,
00:36:08.240 especially for something like sidekick where you couldn't even do it transactionally if you wanted to. um what do you guys recommend for
00:36:16.000 uh kind of observability I guess you could say because obviously if you do something in an after commit you've kind of lost even any capability to do it as
00:36:23.440 part of that transaction or as as in the course of that work so like if it failed halfway through the work at least like
00:36:29.200 part of it has failed so if the after commit fails uh what are your recommendations for
00:36:35.440 like oh well that job didn't get incued maybe I got an error to century or whatever but if I don't catch that What
00:36:42.720 do I do? What do what do you what would you do in an application or what would you recommend?
00:36:52.560 I'm just going to agree with you. Okay. Um, yeah, that's a it's a good question.
00:36:58.560 I will say it depends on what the job is. Like I would say in many cases it
00:37:07.200 may not matter that the job didn't get in queued so you lock that. But it doesn't cause any data integrity
00:37:15.119 problems, right? Our problem was with jobs that you expected to you expect
00:37:20.800 them to run no matter what because otherwise your data will be strange like
00:37:26.240 it will be it will be not not right. So you will need to fix it afterwards. But
00:37:31.680 the many jobs are not like that. Many jobs maybe they they are like turbo streams jobs that if they they get
00:37:38.960 missed doesn't matter or other jobs that yeah maybe you may miss an email but
00:37:45.680 maybe it's not that important or maybe there is a way for you to detect that you didn't send it or yeah or maybe you
00:37:54.400 have some kind of for example for in in our case in in hey which is the app I'm
00:38:01.359 I've been like I'm most familiar with in our email service. There are certain jobs that will be
00:38:08.960 catastrophic if they don't if they don't run. So if they don't get incued or if they don't run for some like someone
00:38:16.000 pulled the plug on the server where the jobs is running and whatever and that is emails related to sending email and
00:38:23.040 receiving email. So we have alerts around that like we we track things in
00:38:29.119 the database that you can alert on like this mail has been delivered or this mail hasn't been you know pro processed
00:38:36.160 or things like that. So we have alerting there. So we know that if the job fail
00:38:41.200 to be incued, we'll we'll be alerted about that. But those are all very
00:38:47.760 specific like we know what jobs those are and we added that logic to like to
00:38:53.359 those alerts. And in other cases we even had custom roll back logic like we encue
00:39:00.480 the job but we when we incue the job we check if the job was incued and if it wasn't incued we roll back whatever we
00:39:07.520 did before. But this is we do only do this in one case and it's because it's very a very specific thing for our app.
00:39:15.200 So yeah, I would say it really depends. I will hope that in most cases losing a
00:39:24.000 job is not catastrophic like that that you can you have to go back and see what
00:39:30.160 you failed to in quue and fix it. And and for the rare cases that are this
00:39:37.359 critical then you will have to do something like alerting or manually
00:39:43.280 handling the situation in the where you the job.
00:39:49.680 I agree. Just just kidding. But for subcritical stuff like whatever uh because Kafka is
00:39:57.040 like absolutely distinct from the database, right? But for critical stuff there's the transactional outworks
00:40:03.440 pattern where you actually store the messages or or jobs or whatever in a database and you have a independent
00:40:09.440 process that is dispatching the data with in in like jobs or yeah whatever in
00:40:14.480 batches uh to make sure that something you mentioned does not happen. Uh it is
00:40:20.480 not brewed into Karafka yet the the transactional outbox pattern engine.
00:40:25.920 There are two available ones that you can plug in that are open source. Uh but
00:40:31.040 yes, I'm working on a third one. Uh exactly because I I I really think it is
00:40:36.480 something really important for people to be able to glue their data sources uh and tooling in a reliable way.
00:40:47.359 Yeah, there was something that I I wish a t job allowed which will be like maybe
00:40:55.040 during the within the transaction you could have like a sort of log somewhere
00:41:00.480 of the jobs you are going to incued do they will get incued after the commit but you will have something that will be
00:41:06.640 stored within the transaction um with some information like you could use maybe you could mark like certain
00:41:13.839 jobs as critical or whatever and it will be stored automatically in a in a sort
00:41:19.200 of log, rolling log, whatever that you could check afterwards and see if those
00:41:24.480 jobs actually run. Something like that. It would be nice. At least for us, it
00:41:29.599 would be nice. We could simplify some of our custom code to handle those situations.
00:41:39.200 Who has another question? I see a hand back here.
00:41:46.640 you. Um, can you talk about how you chose the name of your backend and
00:41:52.400 knowing what you know now, would you pick something else as the name? Uh, sure. Yeah. So, Sidekick,
00:42:00.880 uh, I named it because in any sort of Rails app, you always have the main app
00:42:07.839 server like Puma, but then you also have this thing also running on the side. executing your job. So, it's sort of the
00:42:14.319 sidekick to your main app server process. And that's just really what
00:42:20.079 what it came from.
00:42:25.680 Yeah, that's simple. I just put an R inside of Kafka because of Ruby language, right? And
00:42:31.359 it's like Karafka, which is Yeah. Karaf in in in in Polish. I was like, yeah,
00:42:36.880 that's a good name. Uh it also protects me against litigations like Apache owns the Kafka trademark. Um so any type of
00:42:44.720 commercialization would just go down and I would have to rename which is by the way a really important thing no one
00:42:49.920 thinks. Uh they they I don't want to say steal but they borrow the names based on
00:42:54.960 other languages technologies without being aware that people may have trademarks on them. Uh with Shyuken
00:43:01.359 obviously it was not me but sidekick is you know you kick someone shyuken you punch someone. So kind of kind of get
00:43:08.319 the inspiration. Yeah, it was also a I think it I I wouldn't name it that way because uh
00:43:15.920 Capcom tried to uh trade trademark it. Uh they did fail though. Uh the the
00:43:22.079 request was rejected. Uh but there's still like a bit of a gray area to have a name that is uh associated with
00:43:28.160 something absolutely else that you don't control. Right. So very quick little side note there. I I
00:43:34.800 eventually got the sidekick trademark, but I was rejected the first time because 20 years ago, T-Mobile sold a
00:43:42.960 little cell phone that they called the sidekick, and the trademark office said people
00:43:48.880 could confuse your enterprise software with a consumer cell phone.
00:43:54.400 W Don't Don't you specify the the like application space for trademarks like
00:43:59.920 software, games, other things? Yep. I specified software. They rejected it anyway. But like I said, the second
00:44:06.560 time around I got it. Yeah, mine was again super easy. I
00:44:13.599 didn't choose the name. No, in my case it was because we had solid cache uh
00:44:18.800 that had been built before um by one of my teammates and he was uh in in the
00:44:25.280 beginning that was called active record cache but we didn't like the name very much and I think it was DHH who came up
00:44:32.240 with the name for solid cache like because of the solid state disk and cash like you know and and it's supposed to
00:44:39.680 be solid and so when I was building solid uh solid Q it was
00:44:45.040 that I should be called solid Q because they go together. So super easy. Uh with good job it was very much like
00:44:53.200 uh defensively for my own psychological safety. Um of the entire point being
00:44:59.280 that like it's good, it's not great, it's not the best, it's not the fastest,
00:45:04.319 um it's not the most featureful. And that was largely from being on the internet uh and feeling and especially
00:45:11.440 with like background jobs. I feel like always the question is just like but is it the fastest like what is the
00:45:18.240 performance of it and you know like I say like my my goal was run on Heroku it
00:45:25.119 was like that's really what I wanted and so by naming it I was just like really trying to sidestep anybody trying to
00:45:32.960 like place it as like or make asking me
00:45:38.560 to place it at the pinnacle of being the best of everything else. And so that was
00:45:44.000 like always I was like ah it's it's just good. It's good. Um don't make it be more than that.
00:45:49.520 Well, just keep in mind you can sidestep but you cannot sidekick because he has a trademark on it.
00:45:55.040 Watch it.
00:46:11.839 Are there any uh patterns or practices from outside the Ruby community that you
00:46:17.200 either take inspiration from or you think our community could learn from?
00:46:24.960 Okay, I can start. Uh so my I've been accused of writing Ruby like Java. I
00:46:30.880 I've seen comments like this on Reddit. Yes, I've seen his code. It looks like Java. Uh I I see it as a compliment
00:46:37.200 actually. Uh I I think we're not but again me doing marketing partially so
00:46:43.359 I'm biased uh not embracing event-driven architecture enough uh entity based
00:46:49.520 telling other pieces of system what they what they're supposed to do instead of telling them what you did and making
00:46:55.440 them react independently. So that's something I I I've been missing in many of the systems I worked with. uh the
00:47:02.720 same with a complex workflow modeling uh which is done better in some other
00:47:08.640 heavyduty old-fashioned enterprise systems. Uh apotonic with trailblazer
00:47:14.640 tried I don't know where he is with it. Uh probably in a bar drinking beers. Uh
00:47:20.720 but other languages have tools for modeling including like visual modeling of workflows being able to debug things
00:47:28.400 and understand that and we don't have that. So from my perspective this is something that we could learn from and
00:47:34.480 obviously better concurrency right uh but that we all know that so
00:47:41.040 traditionally the background job has just sort of been this black box you know I'm executing your job I just call
00:47:47.839 perform and and then it it finishes um but one of the more recent changes has
00:47:54.000 been iteration support uh so now that perform blackbox has been broken into
00:48:00.640 a a number of smaller steps. Uh and that's I think been a benefit um to to
00:48:06.319 make more predictable uh jobs. Uh so that's one one pattern that I I've
00:48:12.560 been happy to see the community uh start to uh to embrace.
00:48:23.359 Yeah. I I'll just say I don't like I'm like outside the Rails or Ruby
00:48:29.040 community. I just really appreciate like this group here. Like I'll just say um like Mike has been really helpful. Like
00:48:36.640 Mike reached out to me two years ago um and was like wanted like you know it was
00:48:42.880 I think it was like co and like it was just like oh we should just like chat um about stuff and you were really helpful
00:48:49.200 with like talking about revenue models and you you know had an opinion that you wanted like to share and encourage me to
00:48:55.599 explore that and I did and I appreciated you taking the time with that and like um you know I think a lot of this where
00:49:03.200 I'm just like I guess my theme here is like less on the technical side, but maybe just being nice as a Ruby theme.
00:49:09.520 So, I'm not actually saying anything new, but like talking with Rosa and, you know, like uh having very nice
00:49:16.000 conversations with you about um Solid Q and you asking for like advice from me about good job and um I do feel like
00:49:23.520 maybe Mike your theme of this is a black box that you put your thing in. Um, I've really appreciated just like the number
00:49:30.720 of people that are willing to help um and like like want people to be
00:49:36.880 successful. Uh, and so like I do feel like that aspect of of um doing
00:49:42.480 libraries and things that uh there is a really good community. So yeah, this is not Ruby has a great community. So this
00:49:48.640 is nothing new. Yeah, this guy is great. I I launched my pro version and he just commented it's too cheap.
00:49:53.680 I am pretty awesome. It's true.
00:50:02.720 You're right. By the way, it was definitely too cheap at that time. It usually is the first price is cheap.
00:50:11.119 I don't see it. Uh so for the folks that are just like
00:50:19.359 active job based um although I guess psychic has an active job version and I think you said Karafka can work in
00:50:24.880 active job as well. Yeah. Um, do you wish Active Job was faster than it is?
00:50:30.480 Uh, I know it obviously works really well. It's fast enough for like pretty much every use case, but you can't help but see like the Sidekick benchmarks
00:50:37.119 that show that it's like multiple times slower than just raw Sidekick. Um, do you think there's anything to be done
00:50:42.720 there or is it just kind of ah, it's fast enough. Who cares? That's pure marketing probably on his side. So,
00:50:48.640 but he's awesome so I don't think he would do that. Lies, lies, and benchmarks.
00:50:54.480 Uh, yeah. I mean, very few things have taken more of my mental space than the
00:50:59.520 tradeoff between keyword argument support and pure JSON, right? That's the
00:51:04.800 thing everybody either loves or hates about Sidekick. Um, and I've always tried to square that circle and never
00:51:10.720 been able to do it so far. So, at least good enough that I would want to release it. Um, but that's hard. Um, I I want to
00:51:19.119 get to the point where it's it looks like a nice seamless method invocation and you can use keyword arguments and
00:51:25.359 anything else you want. Uh, I just haven't gotten there. Um, I've got a a
00:51:31.359 huge installed base and backwards compatibility is a massive concern and
00:51:37.520 so it's just hard to make any any large scale change to Sidekick and a similar
00:51:43.520 system uh after a decade of of installs. So, you know, it is what it is right
00:51:50.240 now, but that doesn't mean it can't get better a year or two from now. Keep hope alive.
00:51:57.200 I don't think it matters. um with the performance of it. I guess I feel like
00:52:02.640 always the micro like as soon as you put something in the job um it's gonna blow
00:52:08.079 out the performance um of it. So I guess like like that little bit of of invoking
00:52:15.119 the active job wrapper is going to end up being an infinite decimal amount of
00:52:21.599 time that's going to be happening. Um and I'll just say like I like keyword arguments. I like global ID. Um I like
00:52:30.559 uh I wish more people serialized more data into their active jobs. That's a
00:52:35.839 common question I always get is just like how do I put um the same data into
00:52:40.880 everything like current attributes or something. There's something that needs to get built into active job. Um is
00:52:47.119 taking the current attributes from the environment and serializing it into the job so that those current attributes are
00:52:53.200 current in the job. Um but like I think there's there's quite a lot of potential
00:53:01.599 um in active job that can slow it down. Also uh rails instrumentation is slow
00:53:09.040 and I think for sidekick there is less you get to side s side s side s side s side s side s side s side s side s side s sideep all of all of that like rails
00:53:16.640 rails does a lot for for good and for bad trying to be helpful and that that
00:53:22.079 takes time. Yeah. My primary use case is not running active job and convincing people not to
00:53:29.040 I guess. Um but as you said the the moment someone puts somewhere something
00:53:34.480 inside of this job it doesn't really matter that much. Um uh could it be faster? Most likely yes.
00:53:41.680 Does it matter for most of the people here? Probably not. Uh if it matters to some of the people only then I will
00:53:48.480 actually look into it more. Uh yeah, it's I think it's a it's a good job, you
00:53:54.480 know, it's like active job is a good job. So it's a solid job as well. So
00:54:00.960 it's it's not a side job for you, Mike. So sorry for that. Think we have time for one more question
00:54:08.800 if it exists.
00:54:16.480 I can't see anything. Yeah, it's really hard.
00:54:21.839 I think we'll probably all stay up here if anybody has questions and wants to just come up and chat. I'm sure I'll be
00:54:28.000 willing to stay here and I'm sure the rest probably would be too. Yeah. All right. Thanks everybody.
00:54:35.440 Thanks for coming. Thank you guys. Thank you.
00:54:40.720 Thank you.
Explore all talks recorded at RailsConf 2025
Kayla Reopelle
Jenny Shen
Gannon McGibbon
Justin Wienckowski
Tia Anderson
Alicia Rojas
Albert Pazderin
Rhiannon Payne
+77