Postgresql: 高同時実行APIキー使用時のロック

コミュニティの皆様へ

セルフホスト型のDiscourse APIを利用しています。当社のユースケースは、平均して毎秒約100件のAPIリクエストがあり、同時実行性の点で非常に負荷が高いです。また、高可用性データベースセットアップを提供するためにPostgreSQL+Patroni+HAProxyを使用しています。時折、PostgreSQLがロックされ、Patroniがマスターノードを再起動します。

ブロックされたトランザクションをチェックするためのcronジョブを実装しましたが、この問題が発生するたびに、同じ種類の操作が見つかります。

 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

ご覧のとおり、多くのリクエストが同じAPIキーの最終使用時刻を更新しようとしています。

今のところ、アプリケーションが使用するAPIキーの数を増やして、衝突の可能性を減らしました。APIキーが1分以内に変更されたかどうかを確認するコードがあることに気づきましたが、リクエストを処理するために複数のポッドを使用しているため、この保護は効果的ではないと思われます。

これをバグとして報告すべきか、または(DiscourseまたはPostgreSQLのいずれかで)この種の衝突を回避するためのパラメータがあるかどうかは不明です。ちなみに、最終使用に関する情報は私たちにとって関連性がありますが、1日の解像度で十分です。

また、自動復旧を備えたPostgreSQL HAを管理するための推奨アプローチについても知りたいです。

よろしくお願いします。

同様の問題に遭遇した方、または調査すべき点についてガイダンスをいただける方はいらっしゃいますか? Discourseはこの秒間リクエスト数を処理できないのでしょうか?

前もって感謝いたします。