Certains jobs n'ont pas de mécanisme qui assurent que le dernier job arrivé sur rdvi est bien le dernier traité.
Par exemple, si on ajoute puis retire un usager d'une organisation à la volée, rien ne garantit à priori que le job d'ajout ne sera pas traité après le job d'ajout, ce qui entrainerait une désynchronisation entre les rdvi et rdvsp.
C'est le cas pour les jobs suivants:
ProcessUserProfieJob
ProcessAgentRoleJob
ProcessReferentAssignationJob
Proposition de solution
On pourrait créer une table où on enregistrait les webhooks traités et qui prendrait en entrée:
le nom du job
l'identifier du webhook qui serait définie dans chaque job (par exemple def webhook_identifier = "user_profile:user_#{@data[:user][:id]}_organisation_#{@data[:organisation][:id]}" pour le ProcessUserProfileJob)
le timestamp du webhook
Du coup pour chacun de ces jobs on checkerait d'abord si un webhook a été processé ultérieurement pour ces ressources et on filtrerait le cas échéant. On enregistrerait une nouvelle entrée à la fin du job.
Tous ces jobs devront être bien sûr wrappé dans un lock (avec comme clé le webhook identifier).
On peut implémenter le locking mécanisme nous-même ou utiliser la gem sidekiq-unique-jobs.
Problème
Certains jobs n'ont pas de mécanisme qui assurent que le dernier job arrivé sur rdvi est bien le dernier traité. Par exemple, si on ajoute puis retire un usager d'une organisation à la volée, rien ne garantit à priori que le job d'ajout ne sera pas traité après le job d'ajout, ce qui entrainerait une désynchronisation entre les rdvi et rdvsp. C'est le cas pour les jobs suivants:
ProcessUserProfieJob
ProcessAgentRoleJob
ProcessReferentAssignationJob
Proposition de solution
On pourrait créer une table où on enregistrait les webhooks traités et qui prendrait en entrée:
def webhook_identifier = "user_profile:user_#{@data[:user][:id]}_organisation_#{@data[:organisation][:id]}"
pour leProcessUserProfileJob
)Du coup pour chacun de ces jobs on checkerait d'abord si un webhook a été processé ultérieurement pour ces ressources et on filtrerait le cas échéant. On enregistrerait une nouvelle entrée à la fin du job. Tous ces jobs devront être bien sûr wrappé dans un lock (avec comme clé le webhook identifier).
On peut implémenter le locking mécanisme nous-même ou utiliser la gem sidekiq-unique-jobs.