PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Configuração do Puma Cluster no Heroku


a) Preciso da configuração before_fork / after_fork como inUnicorn, já que os Cluster workers são bifurcados?.

Normalmente não, mas como você está usando preload_app , sim. O pré-carregamento do aplicativo coloca uma instância em execução e, em seguida, bifurca o espaço de memória para os trabalhadores; o resultado é que seus inicializadores são executados apenas uma vez (possivelmente alocando conexões de banco de dados e tal). Neste caso, seu on_worker_boot código é apropriado. Se você não estiver usando o preload_app , então cada trabalhador se inicializa; nesse caso, usar um inicializador seria ideal para configurar a conexão personalizada como você está fazendo. Na verdade, sem preload_app , seu on_worker_boot bloco iria dar erro porque nesse ponto ActiveRecord e amigos nem sequer são carregados.

b) Como faço para ajustar minha contagem de threads dependendo do meu aplicativo - qual seria o motivo para soltá-lo? / Em que casos faria diferença? O 0:16 já não está otimizado?

No Heroku (e nos meus testes), é melhor corresponder ao seu min /max threads, com max <=DB_POOL contexto. O min threads permitem que seu aplicativo reduza os recursos quando não estiver sob carga, o que normalmente é ótimo para liberar recursos no servidor, mas provavelmente menos necessário no Heroku; que o dyno já está dedicado a atender a solicitações da web, também pode tê-los prontos e prontos. Ao definir seu max threads <=seu DB_POOL A variável de ambiente não é necessária, você corre o risco de consumir todas as suas conexões de banco de dados no pool, então você tem um thread querendo uma conexão, mas não consegue, e você pode obter o antigo "ActiveRecord::ConnectionTimeoutError - could not obter uma conexão de banco de dados em 5 segundos." erro. Isso depende do seu aplicativo, porém, você poderia muito bem ter max> DB_POOL e ficar bem. Eu diria que seu DB_POOL deve ser pelo menos igual ao seu min valor de threads, mesmo que suas conexões não sejam carregadas avidamente (os threads 5:5 não abrirão 5 conexões se seu aplicativo nunca atingir o banco de dados).

c) O banco de dados Heroku permite 500 conexões. Qual seria um bom valor para DB_POOL dependendo da contagem de threads, trabalhadores e dinamômetros? - Cada thread por trabalhador por dyno requer uma única conexão de banco de dados ao trabalhar em paralelo?

O Nível de Produção permite 500, para ser claro :)

Cada thread por trabalhador por dinamômetro poderia consomem uma conexão, dependendo se todos estão tentando acessar o banco de dados ao mesmo tempo. Normalmente as conexões são reutilizadas assim que terminam, mas como mencionei em b) , se seus threads forem maiores que seu pool, você poderá ter um mau momento. As conexões serão reutilizadas, tudo isso é tratado pelo ActiveRecord, mas às vezes não é o ideal. Às vezes, as conexões ficam ociosas ou morrem, e é por isso que é sugerido ativar o Reaper, para detectar e recuperar conexões inativas.