feat: Split off queue workers into a separate worker process

This commit is contained in:
Jesse Wierzbinski 2024-11-25 21:54:31 +01:00
parent 0b3e74107e
commit 1b98381242
No known key found for this signature in database
34 changed files with 987 additions and 676 deletions

20
entrypoints/api/index.ts Normal file
View file

@ -0,0 +1,20 @@
import cluster from "node:cluster";
import { sentry } from "@/sentry";
import { createServer } from "@/server";
import { appFactory } from "~/app";
import { config } from "~/packages/config-manager/index.ts";
process.on("SIGINT", () => {
process.exit();
});
if (cluster.isPrimary) {
for (let i = 0; i < Number(process.env.NUM_CPUS ?? 1); i++) {
cluster.fork();
}
await import("~/entrypoints/api/setup.ts");
sentry?.captureMessage("Server started", "info");
} else {
createServer(config, await appFactory());
}

67
entrypoints/api/setup.ts Normal file
View file

@ -0,0 +1,67 @@
import { checkConfig } from "@/init";
import { configureLoggers } from "@/loggers";
import { getLogger } from "@logtape/logtape";
import { Note } from "@versia/kit/db";
import IORedis from "ioredis";
import { setupDatabase } from "~/drizzle/db";
import { config } from "~/packages/config-manager/index.ts";
import { searchManager } from "../../classes/search/search-manager.ts";
const timeAtStart = performance.now();
await configureLoggers();
const serverLogger = getLogger("server");
console.info(`
`);
serverLogger.info`Starting Versia Server...`;
await setupDatabase();
if (config.sonic.enabled) {
await searchManager.connect();
}
// Check if database is reachable
const postCount = await Note.getCount();
await checkConfig(config);
serverLogger.info`Versia Server started at ${config.http.bind}:${config.http.bind_port} in ${(performance.now() - timeAtStart).toFixed(0)}ms`;
serverLogger.info`Database is online, now serving ${postCount} posts`;
if (config.frontend.enabled) {
// Check if frontend is reachable
const response = await fetch(new URL("/", config.frontend.url))
.then((res) => res.ok)
.catch(() => false);
if (!response) {
serverLogger.error`Frontend is unreachable at ${config.frontend.url}`;
serverLogger.error`Please ensure the frontend is online and reachable`;
}
} else {
serverLogger.warn`Frontend is disabled, skipping check`;
}
// Check if Redis is reachable
const connection = new IORedis({
host: config.redis.queue.host,
port: config.redis.queue.port,
password: config.redis.queue.password,
db: config.redis.queue.database,
maxRetriesPerRequest: null,
});
await connection.ping();
serverLogger.info`Redis is online`;

View file

@ -0,0 +1,29 @@
import { sentry } from "@/sentry";
import { getLogger } from "@logtape/logtape";
import chalk from "chalk";
import { getDeliveryWorker } from "~/classes/workers/delivery";
import { getFetchWorker } from "~/classes/workers/fetch";
import { getInboxWorker } from "~/classes/workers/inbox";
process.on("SIGINT", () => {
process.exit();
});
await import("~/entrypoints/worker/setup.ts");
sentry?.captureMessage("Server started", "info");
const serverLogger = getLogger("server");
serverLogger.info`Starting Fetch Worker...`;
getFetchWorker();
serverLogger.info`${chalk.green("✔")} Fetch Worker started`;
serverLogger.info`Starting Delivery Worker...`;
getDeliveryWorker();
serverLogger.info`${chalk.green("✔")} Delivery Worker started`;
serverLogger.info`Starting Inbox Worker...`;
getInboxWorker();
serverLogger.info`${chalk.green("✔")} Inbox Worker started`;
serverLogger.info`${chalk.green("✔✔✔")} All workers started`;

View file

@ -0,0 +1,55 @@
import { checkConfig } from "@/init";
import { configureLoggers } from "@/loggers";
import { getLogger } from "@logtape/logtape";
import { Note } from "@versia/kit/db";
import chalk from "chalk";
import IORedis from "ioredis";
import { setupDatabase } from "~/drizzle/db";
import { config } from "~/packages/config-manager/index.ts";
import { searchManager } from "../../classes/search/search-manager.ts";
const timeAtStart = performance.now();
await configureLoggers();
const serverLogger = getLogger("server");
console.info(`
${chalk.redBright.bold("** WORKER MODE **")}
`);
serverLogger.info`Starting Versia Server Worker...`;
await setupDatabase();
if (config.sonic.enabled) {
await searchManager.connect();
}
// Check if database is reachable
const postCount = await Note.getCount();
await checkConfig(config);
serverLogger.info`Versia Server Worker started at ${config.http.bind}:${config.http.bind_port} in ${(performance.now() - timeAtStart).toFixed(0)}ms`;
serverLogger.info`Database is online, containing ${postCount} posts`;
// Check if Redis is reachable
const connection = new IORedis({
host: config.redis.queue.host,
port: config.redis.queue.port,
password: config.redis.queue.password,
db: config.redis.queue.database,
maxRetriesPerRequest: null,
});
await connection.ping();
serverLogger.info`Redis is online`;