Test Driving Sidekiq and Crystal

2016-06-14

It’s alive! I’ve finished the initial port of the three core pieces of Sidekiq, the client API, the job execution engine and the Web UI, to Crystal. Let’s assume we have a Ruby app using Sidekiq.rb and integrate Sidekiq.cr to run beside it.

Getting Started

Sidekiq.cr has a Getting Started wiki page which walks you through the basics of setting up a new Crystal app. Follow those directions. Once complete, you should have a Worker named Sample::MyWorker that we can call. We’re going to build the Sidekiq.cr binary and run it with ./sidekiq -q crystal . Sidekiq.cr is now listening for jobs on the crystal queue only. Any Ruby-based jobs should use other queues so the Crystal worker will never see them - exactly what we want.

We’ve defined one Worker in the Crystal app:

module Sample class MyWorker include Sidekiq :: Worker def perform (name : String, count : Int64 ) count . times do logger . info "Hello, #{ name } !" end end end end

Open up an IRB console and run this:

require "sidekiq" Sidekiq :: Client . push( "class" => "Sample::MyWorker" , "args" => [ "Ruby" , 3 ] , "queue" => "crystal" )

Immediately you should see Sidekiq.cr print out three lines:

2016-06-13T21:03:21.676Z 3936 TID-223icg0 JID=896704d437d398abdf13eb06 INFO: Start 2016-06-13T21:03:21.676Z 3936 TID-223icg0 JID=896704d437d398abdf13eb06 INFO: Hello, Ruby! 2016-06-13T21:03:21.676Z 3936 TID-223icg0 JID=896704d437d398abdf13eb06 INFO: Hello, Ruby! 2016-06-13T21:03:21.676Z 3936 TID-223icg0 JID=896704d437d398abdf13eb06 INFO: Hello, Ruby! 2016-06-13T21:03:21.676Z 3936 TID-223icg0 JID=896704d437d398abdf13eb06 INFO: Done: 0.000121 sec

Nearly identical to Sidekiq.rb but look at that execution time: 121µs! In real world code, I’m seeing Crystal execute 5-10x faster than MRI.

So… got tons of little jobs? Got compute-heavy jobs? Crystal and Sidekiq.cr might be the solution you’re looking for! Got questions? Find a bug? Open an issue.