Bazley
Bazley

Reputation: 2847

Rails - running threads after method has exited

When the client changes his profile picture it hits the update method, which responds with update.js.erb. This is a fast and straightforward process. However, behind the scenes on the server, a bunch of files (10 of them) is generated from the profile picture and these need to be uploaded to an Amazon bucket from the server. This a lengthy process and I don't want to make the client wait until it is finished. Moreover, the file uploads often fail with a RequestTimeoutException because they take longer than 15 seconds.

All this raises many questions:

How do you do the 10 file generation/upload after the update method has exited? Threads are killed after the main method has finished.

How do you catch an exception inside a thread? The following code does not catch the timeout exceptions.

threads = []

threads << Thread.new {
  begin
    # upload file 1 ....
  rescue Rack::Timeout::RequestTimeoutException => e
    # try to upload again ....
  else
  ensure
  end
}

threads << Thread.new {
  begin
    # upload file 2 ....
  rescue Rack::Timeout::RequestTimeoutException => e
    # try to upload again ....
  else
  ensure
  end
}

threads.each { |thr|
  thr.join
}

What's the best way to try to upload a file again if it timed out?

What is the best solution to this problem?

Upvotes: 0

Views: 209

Answers (2)

ray
ray

Reputation: 5552

You need to use delayed_job or whenever gem for background task, but I would like suggest sidekiq

Upvotes: 2

Prince Bansal
Prince Bansal

Reputation: 286

I also faced the same problem in a project. I came accross a solution using AWS lambda. You can use carrierwave gem/ rails 5 active storage module if you are using rails to upload image on S3. If you are not using rails then use AWS-SDK for ruby to upload files on S3. You can bind events whenever a file created/modified on S3. Whenever a file created it will invoke lambda function and your work is done. can bind them to lambda function. In lambda function you can write logic to create files and upload it back to s3. You can write lambda code in ruby, node and python.

This strategy may help you.

Upvotes: 0

Related Questions