Skip to content

Commit dd27aad

Browse files
TimeraaBas950
andcommitted
chore: redis cluster
Co-authored-by: Bas van Zanten <me@bas950.com>
1 parent e531d88 commit dd27aad

File tree

13 files changed

+230
-138
lines changed

13 files changed

+230
-138
lines changed

apps/master/package.json

+1-3
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@
1212
"@sentry/tracing": "^7.46.0",
1313
"cron": "^2.3.0",
1414
"debug": "^4.3.4",
15-
"ioredis": "^5.0.1",
1615
"mongodb": "^5.1.0",
17-
"p-event": "^6.0.0",
16+
"redis": "^4.6.12",
1817
"source-map-support": "^0.5.21"
1918
},
2019
"devDependencies": {
2120
"@types/cron": "^2.0.1",
2221
"@types/debug": "^4.1.7",
23-
"@types/ioredis": "^4.28.10",
2422
"dotenv": "^16.0.3",
2523
"ts-devscript": "^3.0.7",
2624
"typescript": "^5.0.3"

apps/master/src/index.ts

+9-10
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import * as Sentry from "@sentry/node";
66
import { Integrations } from "@sentry/tracing";
77
import debug from "debug";
88
import { MongoClient } from "mongodb";
9-
import { Redis } from "ioredis";
9+
import { createCluster } from "redis";
1010

1111
import calculatePresenceUsage from "./util/calculatePresenceUsage.js";
1212
import updateScience from "./util/updateScience.js";
13-
import { pEvent } from "p-event";
1413

1514
if (process.env.NODE_ENV !== "production")
1615
(await import("dotenv")).config({ path: "../../../.env" });
@@ -24,14 +23,12 @@ Sentry.init({
2423
integrations: [new Integrations.Mongo()]
2524
});
2625

27-
export const redis = new Redis({
28-
sentinels: [
26+
export const redis = createCluster({
27+
rootNodes: [
2928
{
30-
host: process.env.REDIS_HOST || "localhost",
31-
port: parseInt(process.env.REDIS_PORT || "26379")
29+
url: process.env.REDIS_URL || "redis://localhost:6379"
3230
}
33-
],
34-
name: "mymaster"
31+
]
3532
}),
3633
mongo = new MongoClient(process.env.MONGO_URL!, {
3734
appName: "PreMiD-API-Master"
@@ -40,8 +37,10 @@ export const redis = new Redis({
4037

4138
debug.enable("API-Master*");
4239

43-
mainLog("Connecting to MongoDB and Redis...");
44-
await Promise.all([mongo.connect(), pEvent(redis, "connect")]);
40+
mainLog("Connecting to MongoDB...");
41+
await mongo.connect();
42+
mainLog("Connecting to Redis...");
43+
await redis.connect();
4544
mainLog("Connected!");
4645

4746
await Promise.all([updateScience(), calculatePresenceUsage()]);

apps/master/src/util/updateScience.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default async function () {
55
key = "pmd-api.scienceUpdates";
66

77
log("Updating...");
8-
const scienceUpdates = await redis.hvals(key);
8+
const scienceUpdates = await redis.hVals(key);
99

1010
let invalidEntries: string[] = [],
1111
entries: {
@@ -35,7 +35,7 @@ export default async function () {
3535
}
3636

3737
if (invalidEntries.length) {
38-
await redis.hdel(key, ...invalidEntries);
38+
await redis.hDel(key, invalidEntries);
3939
log("Deleted %n invalid entries", invalidEntries.length);
4040
}
4141

@@ -53,7 +53,10 @@ export default async function () {
5353
}))
5454
);
5555

56-
await redis.hdel(key, ...entries.map(e => e.identifier));
56+
await redis.hDel(
57+
key,
58+
entries.map(e => e.identifier)
59+
);
5760

5861
log(
5962
"Inserted %s entries, Updated %s entries",
@@ -62,7 +65,7 @@ export default async function () {
6265
);
6366
} else log("No entries to update");
6467

65-
const delRedis = await redis.hvals("pmd-api.scienceDeletes");
68+
const delRedis = await redis.hVals("pmd-api.scienceDeletes");
6669

6770
let orMatch: any[] = [
6871
{
@@ -76,7 +79,7 @@ export default async function () {
7679
$or: orMatch
7780
});
7881

79-
if (delRedis.length) await redis.hdel("pmd-api.scienceDeletes", ...delRedis);
82+
if (delRedis.length) await redis.hDel("pmd-api.scienceDeletes", delRedis);
8083

8184
if (delRes.deletedCount) log("Deleted %s entries", delRes.deletedCount);
8285
}

apps/worker/package.json

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@
77
"build": "tsc && devScript --copyOnly"
88
},
99
"dependencies": {
10-
"@keyv/redis": "^2.5.1",
1110
"@sentry/node": "^6.19.2",
1211
"@sentry/tracing": "^6.19.2",
13-
"apollo-datasource": "^3.3.1",
1412
"apollo-server-cache-redis": "^3.3.1",
1513
"apollo-server-caching": "^3.3.0",
1614
"apollo-server-core": "^3.6.6",
@@ -21,18 +19,19 @@
2119
"axios": "^0.27.0",
2220
"fastify": "^3.27.4",
2321
"graphql": "^16.3.0",
24-
"ioredis": "^5.0.1",
22+
"keyv": "^4.5.4",
23+
"keyv-anyredis": "^3.3.0",
2524
"language-flag-colors": "^2.1.1",
2625
"lodash": "^4.17.21",
2726
"mongodb": "^4.4.1",
2827
"mongodb-caching": "^1.1.0",
2928
"p-event": "^4.2.0",
29+
"redis": "^4.6.12",
3030
"source-map-support": "^0.5.21",
3131
"validator": "^13.7.0"
3232
},
3333
"devDependencies": {
3434
"@types/archiver": "^5.3.1",
35-
"@types/ioredis": "^4.28.10",
3635
"@types/lodash": "^4.14.180",
3736
"@types/node": "^18.16.0",
3837
"@types/validator": "^13.7.2",

apps/worker/src/index.ts

+16-20
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,15 @@ import {
1212
import { ApolloServer } from "apollo-server-fastify";
1313
import responseCachePlugin from "apollo-server-plugin-response-cache";
1414
import fastify, { FastifyContext, FastifyReply, FastifyRequest } from "fastify";
15-
import Redis from "ioredis";
15+
import { createCluster } from "redis";
1616
import { MongoClient } from "mongodb";
17-
import pEvent from "p-event";
1817

1918
import appUpdate from "./generic/appUpdate";
2019
import ffUpdates from "./generic/ffUpdates";
2120
import zippedPresences from "./generic/zippedPresences";
2221
import fastifyAppClosePlugin from "./plugins/fastifyAppClosePlugin";
2322
import sentryPlugin from "./plugins/sentryPlugin";
2423
import dataSources from "./util/dataSources";
25-
import zipPresences from "./util/functions/zipPresences";
2624
import deleteScience from "./v2/deleteScience";
2725
import versions from "./v2/versions";
2826
import { resolvers as v3Resolvers } from "./v3/resolvers";
@@ -45,25 +43,25 @@ if (process.env.SENTRY_DSN)
4543
export const mongodb = new MongoClient(process.env.MONGO_URL!, {
4644
appName: "PreMiD-API-Worker"
4745
}),
48-
redis = new Redis({
49-
sentinels: [
46+
redis = createCluster({
47+
rootNodes: [
5048
{
51-
host: process.env.REDIS_HOST || "localhost",
52-
port: parseInt(process.env.REDIS_PORT || "26379")
49+
url: process.env.REDIS_URL || "redis://localhost:6379"
5350
}
5451
],
55-
name: "mymaster"
52+
useReplicas: true
5653
}),
5754
baseRedisCache = new BaseRedisCache({
5855
//@ts-ignore
5956
client: redis
6057
}),
61-
dSources = dataSources(),
6258
app = fastify({
6359
connectionTimeout: 10_000,
6460
keepAliveTimeout: 10_000
6561
});
6662

63+
export let dSources: ReturnType<typeof dataSources>;
64+
6765
export let v3Server: ApolloServer<FastifyContext>,
6866
v4Server: ApolloServer<FastifyContext>;
6967

@@ -72,6 +70,14 @@ export interface Context {
7270
}
7371

7472
async function run() {
73+
redis.setMaxListeners(12);
74+
redis.on("error", error => {
75+
console.log(error);
76+
});
77+
await redis.connect();
78+
79+
dSources = dataSources();
80+
7581
const apolloGenericSettings = {
7682
dataSources: () => dSources,
7783
context: (req: FastifyRequest, res: FastifyReply) => {
@@ -111,17 +117,7 @@ async function run() {
111117
resolvers: await v4Resolvers
112118
});
113119

114-
await Promise.all([
115-
mongodb.connect(),
116-
pEvent(redis, "connect"),
117-
v3Server.start(),
118-
v4Server.start(),
119-
zipPresences()
120-
]);
121-
122-
setInterval(() => {
123-
zipPresences();
124-
}, 60_000);
120+
await Promise.all([mongodb.connect(), v3Server.start(), v4Server.start()]);
125121

126122
app.addHook("onError", (_, _1, error, done) => {
127123
Sentry.captureException(error);

apps/worker/src/util/dataSources.ts

+22-17
Original file line numberDiff line numberDiff line change
@@ -15,79 +15,84 @@ import { Sponsors } from "../v3/fields/sponsors";
1515
import { Usage } from "../v3/fields/usage";
1616
import { Versions } from "../v3/fields/versions";
1717
import { Strings } from "../v4/fields/strings";
18-
import KeyvRedis from "@keyv/redis";
18+
import { KeyvRedis } from "./keyv";
1919

2020
export let pmdDb: Db, dSources: ReturnType<typeof dataSources>;
2121

22+
let store: KeyvRedis;
23+
2224
export default function dataSources() {
25+
if (!store) {
26+
store = new KeyvRedis(redis);
27+
}
2328
pmdDb = mongodb.db("PreMiD");
2429

2530
const keyvDefaultOptions = {
26-
store: new KeyvRedis(redis),
31+
store: store,
2732
ttl: 60 * 1000
2833
};
2934

3035
const sources = {
3136
usage: new Usage(pmdDb.collection("science"), {
3237
...keyvDefaultOptions,
3338
namespace: "science"
34-
}),
39+
} as any),
3540
presences: new Presences(pmdDb.collection("presences"), {
3641
...keyvDefaultOptions,
3742
namespace: "presences"
38-
}),
43+
} as any),
3944
versions: new Versions(pmdDb.collection("versions"), {
4045
...keyvDefaultOptions,
4146
namespace: "versions"
42-
}),
47+
} as any),
4348
discordUsers: new DiscordUsers(pmdDb.collection("discordUsers"), {
4449
...keyvDefaultOptions,
4550
namespace: "discordUsers"
46-
}),
51+
} as any),
4752
langFiles: new LangFiles(pmdDb.collection("langFiles"), {
4853
...keyvDefaultOptions,
4954
namespace: "langFiles"
50-
}),
55+
} as any),
5156
strings: new Strings(pmdDb.collection("strings"), {
5257
...keyvDefaultOptions,
5358
namespace: "strings"
54-
}),
59+
} as any),
5560
sponsors: new Sponsors(pmdDb.collection("sponsors"), {
5661
...keyvDefaultOptions,
5762
namespace: "sponsors"
58-
}),
63+
} as any),
5964
partners: new Partners(pmdDb.collection("partners"), {
6065
...keyvDefaultOptions,
6166
namespace: "partners"
62-
}),
67+
} as any),
6368
jobs: new Jobs(pmdDb.collection("jobs"), {
6469
...keyvDefaultOptions,
6570
namespace: "jobs"
66-
}),
71+
} as any),
6772
downloads: new Downloads(pmdDb.collection("downloads"), {
6873
...keyvDefaultOptions,
6974
namespace: "downloads"
70-
}),
75+
} as any),
7176
alphaUsers: new AlphaUsers(pmdDb.collection("alphaUsers"), {
7277
...keyvDefaultOptions,
7378
namespace: "alphaUsers"
74-
}),
79+
} as any),
7580
betaUsers: new BetaUsers(pmdDb.collection("betaUsers"), {
7681
...keyvDefaultOptions,
7782
namespace: "betaUsers"
78-
}),
83+
} as any),
7984
credits: new Credits(pmdDb.collection("credits"), {
8085
...keyvDefaultOptions,
8186
namespace: "credits"
82-
}),
87+
} as any),
8388
benefits: new Benefits(pmdDb.collection("benefits"), {
8489
...keyvDefaultOptions,
8590
namespace: "benefits"
86-
}),
91+
} as any),
8792
ffUpdates: new FFUpdates(pmdDb.collection("ffUpdates"), {
8893
...keyvDefaultOptions,
8994
namespace: "ffUpdates"
90-
})
95+
} as any)
9196
};
9297

9398
dSources = sources;

0 commit comments

Comments
 (0)