Verrous PostgreSQL avec une utilisation élevée de l'API clé

Bonjour Communauté,

Nous utilisons l’API Discourse sur une installation auto-hébergée. Notre cas d’utilisation est assez intensif en termes de concurrence, avec environ 100 requêtes API par seconde en moyenne. Nous utilisons également PostgreSQL+Patroni+HAProxy pour fournir une configuration de base de données haute disponibilité. Occasionnellement, notre PostgreSQL se bloque et Patroni redémarre le nœud maître.

Nous avons implémenté un cron job pour vérifier les transactions bloquées, et à chaque fois que ce problème survient, nous trouvons le même type d’opérations :

 blocked_pid | blocked_user | blocking_pid | blocking_user |                                       blocked_statement                                        |                             current_statement_in_blocking_process                              
-------------+--------------+--------------+---------------+------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------
      297904 | discourse    |       293083 | discourse     | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:38:16.822352' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
      296718 | discourse    |       293083 | discourse     | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:50.900480' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21
      293101 | discourse    |       293083 | discourse     | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:49.485074' WHERE "api_keys"."id" = 21 | UPDATE "api_keys" SET "last_used_at" = '2024-07-16 16:34:48.163449' WHERE "api_keys"."id" = 21

Comme vous pouvez le voir, de nombreuses requêtes tentent de mettre à jour l’heure de la dernière utilisation de la même clé API.

Pour l’instant, nous avons augmenté le nombre de clés API que notre application utilise pour réduire la probabilité de collision. J’ai remarqué qu’il existe du code en place qui vérifie si la clé API a été modifiée au cours de la dernière minute pour éviter une mise à jour. Cependant, je suppose que puisque nous utilisons plus d’un pod pour traiter les requêtes, cette protection n’est pas efficace.

Je ne suis pas sûr si nous devrions signaler cela comme un bug ou s’il existe des paramètres pour éviter ce type de collision (que ce soit dans Discourse ou PostgreSQL). Notez que pour nous, les informations relatives à la dernière utilisation sont pertinentes, mais une résolution d’un jour serait suffisante.

J’aimerais également savoir quelle est l’approche préférée pour gérer la haute disponibilité de PostgreSQL avec récupération automatique.

Merci

Quelqu’un a-t-il rencontré un problème similaire ou peut-il me donner des conseils sur ce qu’il faut enquêter ? Est-il possible que Discourse ne soit pas conçu pour gérer ce volume de requêtes par seconde ?

Merci d’avance.