You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Right now we can provide per-actor settings for the retry policy using a predicate in the actor decorator's argument retry_when. However, there is no such option to override backoff times used for retrying tasks.
The case: I am using an actor to send a webhook to an external service. We have agreed that a webhook should be retried three times if the first attempt fails. Second attempt after 1 minute, third attempt after 5 minutes, fourth attempt after an hour. It is not easy to implement such logic in dramatiq at the moment.
Having spent quite some time reading docs, issues, and sources I've come up with this workaround using CurrentMessage middleware:
@dramatiq.actor(queue_name="send_partner_webhook", max_retries=3)defsend_partner_webhook_actor(webhook: PartnerWebhook) ->None:
try:
send_partner_webhook(webhook)
exceptPartnerWebhookRequestFailedErrorase:
message: dramatiq.Message=dramatiq.middleware.CurrentMessage.get_current_message()
retries_so_far: int=message.options.get("retries", 0)
backoff= {
0: 60_000, # backoff before first retry - 1 min1: 300_000, # backoff before second retry - 5 min2: 3_600_000, # backoff before third retry - 1 hour
}
ifretries_so_farnotinbackoff:
raiseeraisedramatiq.errors.Retry(str(e), delay=backoff[retries_so_far])
I think it should be easier to achieve this behavior using an argument similar to retry_when:
defbackoff_factory(retries_so_far: int) ->int:
backoff= {
0: 60_000, # backoff before first retry - 1 min1: 300_000, # backoff before second retry - 5 min2: 3_600_000, # backoff before third retry - 1 hour
}
returnbackoff.get(retries_so_far, 3_600_000)
@dramatiq.actor(queue_name="send_partner_webhook", max_retries=3, backoff_factory=backoff_factory)defsend_partner_webhook_actor(webhook: PartnerWebhook) ->None:
send_partner_webhook(webhook)
Thank you for your work, I hope that this feature request makes it into a future release!
The text was updated successfully, but these errors were encountered:
I think it's also depends on Exception type. And passing (retries, exception) to backoff_factory will also consistent with retry_when which already handle this parameters
What version of Dramatiq are you using?
1.14.2
Description
Right now we can provide per-actor settings for the retry policy using a predicate in the actor decorator's argument
retry_when
. However, there is no such option to override backoff times used for retrying tasks.The case: I am using an actor to send a webhook to an external service. We have agreed that a webhook should be retried three times if the first attempt fails. Second attempt after 1 minute, third attempt after 5 minutes, fourth attempt after an hour. It is not easy to implement such logic in dramatiq at the moment.
Having spent quite some time reading docs, issues, and sources I've come up with this workaround using
CurrentMessage
middleware:I think it should be easier to achieve this behavior using an argument similar to
retry_when
:Thank you for your work, I hope that this feature request makes it into a future release!
The text was updated successfully, but these errors were encountered: