From 2bbad70e099ff712d60a1e8240bcbc76f8e88830 Mon Sep 17 00:00:00 2001 From: Dominic Ferrando Date: Sat, 18 Jul 2026 02:39:25 -0400 Subject: [PATCH] Better distribute db connection pool amongst workers --- apps/api/src/database/db.ts | 3 ++- apps/api/src/index.ts | 8 +++----- apps/api/src/scripts/validate-products.ts | 1 - apps/api/src/util.ts | 5 ++++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/api/src/database/db.ts b/apps/api/src/database/db.ts index 1ac9501..0d15d6f 100644 --- a/apps/api/src/database/db.ts +++ b/apps/api/src/database/db.ts @@ -1,12 +1,13 @@ import { CreateTableBuilder, Kysely, PostgresDialect, sql } from 'kysely'; import { type DB } from "./out/db"; import { Pool } from "pg"; -import { env } from '../util'; +import { env, WORKER_COUNT } from '../util'; export const db = new Kysely({ dialect: new PostgresDialect({ pool: new Pool({ connectionString: env.DATABASE_URL, + max: Math.max(1, Math.floor(+env.DATABASE_POOL_MAX / WORKER_COUNT)) }), }) }); diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index a7024dc..01ac074 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -1,11 +1,9 @@ import cluster from 'node:cluster' -import os from 'node:os' -import { env, log } from "./util"; +import { log, WORKER_COUNT } from "./util"; if (cluster.isPrimary) { - const n = Math.min(os.availableParallelism(), +env.MAX_WORKER_PROCESSES); - log.info(`Starting ${n} worker processes`) - for (let i = 0; i < n; i++) + log.info(`Starting ${WORKER_COUNT} worker processes`) + for (let i = 0; i < WORKER_COUNT; i++) cluster.fork() } else { await import('./server') diff --git a/apps/api/src/scripts/validate-products.ts b/apps/api/src/scripts/validate-products.ts index 8e352e3..0abe0ce 100644 --- a/apps/api/src/scripts/validate-products.ts +++ b/apps/api/src/scripts/validate-products.ts @@ -56,7 +56,6 @@ for (const wProduct of wProducts) { console.log("Printful: " + pVariant.id, pVariant.name); const expectedColor = syncer.parseColorGroup(pVariant.name) ?? pVariant.color; const validations = [ - // validateEquality(sku.fieldData.name, pVariant.name), validateEquality( wSku.fieldData["sku-values"]?.["color"], expectedColor, diff --git a/apps/api/src/util.ts b/apps/api/src/util.ts index 6f0e588..4e50f7e 100644 --- a/apps/api/src/util.ts +++ b/apps/api/src/util.ts @@ -1,6 +1,7 @@ import cluster from 'node:cluster'; import { createHash } from 'node:crypto'; import { pino } from 'pino'; +import os from 'node:os' export const log = pino({ level: Bun.env.LOG_LEVEL ?? "info", @@ -21,11 +22,13 @@ export const env = { AUTH_SECRET: requireEnv("AUTH_SECRET"), ADMIN_PASSWORD: requireEnv("ADMIN_PASSWORD"), DATABASE_URL: requireEnv("DATABASE_URL"), - MAX_WORKER_PROCESSES: requireEnv("MAX_WORKER_PROCESSES"), + DATABASE_POOL_MAX: requireEnv("DATABASE_POOL_MAX"), + MAX_WORKER_COUNT: requireEnv("MAX_WORKER_COUNT"), NODE_ENV: optionEnv("NODE_ENV", "development"), LOG_LEVEL: optionEnv("LOG_LEVEL", "info"), }; +export const WORKER_COUNT = Math.min(os.availableParallelism(), +env.MAX_WORKER_COUNT); export const DEFAULT_NAME = "Default"; function requireEnv(key: string): string {