How to create a Rails/Ruby method similar to javascript throttle/debounce function
Asked Answered
U

1

8

In our application we expose a callback route for an external service to hit. When we receive the callback, we publish an update to client-side subscribers using Eventsource on the client/browser-side and cramp on the server side. Sometimes, however, we get bombarded with callback requests from this external service which results in us publishing a crap ton of updates to the client. Is there a way on the Rails-side, similar to a javascript debounce function, that would wait a set time between callbacks received to publish the message?

We're using sidekiq + threads already, so open to suggestions using those tools.

Urceolate answered 27/8, 2015 at 18:35 Comment(0)
L
9

There is a Sidekiq-debounce gem available.

Another approach (without such gem) is to use the Rails.cache to trigger your execution only once per x time

delay = 1.minute
Rails.cache.fetch('unique-identifier-of-the-job', expires_in: delay) do
 YourActiveJobHere.set(wait: delay).perform_later('your-action')
end
Logographic answered 10/10, 2016 at 12:21 Comment(2)
interesting approach, @MaximKrizhanovsky! I'll give the cache approach a try.Urceolate
while the cache is an excellent idea, and I love the simplicity behind it, it will not work with any sort of load balancer or other situation where there are multiple rails instances if it has to be debounced across the applicationHeulandite

© 2022 - 2024 — McMap. All rights reserved.