Better distribute db connection pool amongst workers
This commit is contained in:
@@ -1,12 +1,13 @@
|
|||||||
import { CreateTableBuilder, Kysely, PostgresDialect, sql } from 'kysely';
|
import { CreateTableBuilder, Kysely, PostgresDialect, sql } from 'kysely';
|
||||||
import { type DB } from "./out/db";
|
import { type DB } from "./out/db";
|
||||||
import { Pool } from "pg";
|
import { Pool } from "pg";
|
||||||
import { env } from '../util';
|
import { env, WORKER_COUNT } from '../util';
|
||||||
|
|
||||||
export const db = new Kysely<DB>({
|
export const db = new Kysely<DB>({
|
||||||
dialect: new PostgresDialect({
|
dialect: new PostgresDialect({
|
||||||
pool: new Pool({
|
pool: new Pool({
|
||||||
connectionString: env.DATABASE_URL,
|
connectionString: env.DATABASE_URL,
|
||||||
|
max: Math.max(1, Math.floor(+env.DATABASE_POOL_MAX / WORKER_COUNT))
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
import cluster from 'node:cluster'
|
import cluster from 'node:cluster'
|
||||||
import os from 'node:os'
|
import { log, WORKER_COUNT } from "./util";
|
||||||
import { env, log } from "./util";
|
|
||||||
|
|
||||||
if (cluster.isPrimary) {
|
if (cluster.isPrimary) {
|
||||||
const n = Math.min(os.availableParallelism(), +env.MAX_WORKER_PROCESSES);
|
log.info(`Starting ${WORKER_COUNT} worker processes`)
|
||||||
log.info(`Starting ${n} worker processes`)
|
for (let i = 0; i < WORKER_COUNT; i++)
|
||||||
for (let i = 0; i < n; i++)
|
|
||||||
cluster.fork()
|
cluster.fork()
|
||||||
} else {
|
} else {
|
||||||
await import('./server')
|
await import('./server')
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import cluster from 'node:cluster';
|
import cluster from 'node:cluster';
|
||||||
import { createHash } from 'node:crypto';
|
import { createHash } from 'node:crypto';
|
||||||
import { pino } from 'pino';
|
import { pino } from 'pino';
|
||||||
|
import os from 'node:os'
|
||||||
|
|
||||||
export const log = pino({
|
export const log = pino({
|
||||||
level: Bun.env.LOG_LEVEL ?? "info",
|
level: Bun.env.LOG_LEVEL ?? "info",
|
||||||
@@ -21,11 +22,13 @@ export const env = {
|
|||||||
AUTH_SECRET: requireEnv("AUTH_SECRET"),
|
AUTH_SECRET: requireEnv("AUTH_SECRET"),
|
||||||
ADMIN_PASSWORD: requireEnv("ADMIN_PASSWORD"),
|
ADMIN_PASSWORD: requireEnv("ADMIN_PASSWORD"),
|
||||||
DATABASE_URL: requireEnv("DATABASE_URL"),
|
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"),
|
NODE_ENV: optionEnv("NODE_ENV", "development"),
|
||||||
LOG_LEVEL: optionEnv("LOG_LEVEL", "info"),
|
LOG_LEVEL: optionEnv("LOG_LEVEL", "info"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const WORKER_COUNT = Math.min(os.availableParallelism(), +env.MAX_WORKER_COUNT);
|
||||||
export const DEFAULT_NAME = "Default";
|
export const DEFAULT_NAME = "Default";
|
||||||
|
|
||||||
function requireEnv(key: string): string {
|
function requireEnv(key: string): string {
|
||||||
|
|||||||
Reference in New Issue
Block a user