コミュニティの皆様へ
セルフホスト型の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を管理するための推奨アプローチについても知りたいです。
よろしくお願いします。