Olá Comunidade,
Estamos usando a API do Discourse em uma instalação auto-hospedada. Nosso caso de uso é bastante intensivo em termos de concorrência, com cerca de 100 requisições de API por segundo em média. Também estamos usando PostgreSQL+Patroni+HAProxy para fornecer uma configuração de banco de dados de alta disponibilidade. Ocasionalmente, nosso PostgreSQL trava e o Patroni reinicia o nó mestre.
Implementamos um job cron para verificar transações bloqueadas e, sempre que esse problema ocorre, encontramos o mesmo tipo de operação:
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
Como você pode ver, muitas requisições estão tentando atualizar o tempo de último uso da mesma chave de API.
Por enquanto, aumentamos o número de chaves de API que nosso aplicativo está usando para reduzir a probabilidade de colisão. Notei que há código implementado que verifica se a chave de API foi modificada no último minuto para evitar uma atualização. No entanto, presumo que, como estamos usando mais de um pod para processar as requisições, essa proteção não é eficaz.
Não tenho certeza se devemos relatar isso como um bug ou se existem parâmetros para evitar esse tipo de colisão (seja no Discourse ou no PostgreSQL). Observe que, para nós, as informações relacionadas ao último uso são relevantes, mas uma resolução de 1 dia seria suficiente.
Gostaria também de saber qual é a abordagem preferida para gerenciar HA do PostgreSQL com recuperação automática.
Obrigado.