Our app has been getting traction recently, and we struggle to cope with the traffic. I was hoping you guys could point me in the right direction.
For each request, the app does some heavy calculations. They are not done in Ruby, we use a compiled, shared lib for this. Our current architecture is:
user request triggers 2 background jobs (via Workling/Starling)
the first worker does some pre-processing (including polling the DB), call the shared lib, and loop. It sends results along the way to the second worker.
the second worker does some post-processing and sends results back to the app.
I think the key problem is the call to the shared lib is blocking, so when we get lots of calls at once, it seems to me all the workers are stuck on this lib and nothing else happens (there are a limited number of workers).
I have a couple of options in mind, but I have no idea which one should give better results:
upgrade to Ruby 1.9.3 (from 1.8.7)
migrate from DL/Load to FFI (but I don’t believe it sorts the blocking issue)
consider another Ruby implementation
consider a different architecture. For instance I could run this shared lib on a separate instance without anything else (just Ruby processes) but I am not sure how to do this considering speed will be key.