Skip to content

Commit 2aa39c4

Browse files
committed
Refactor Redis subscriber client initialization to ensure main Redis client readiness before creating subscriber. Update error handling and connection logic for improved reliability.
1 parent 6e0c5a9 commit 2aa39c4

2 files changed

Lines changed: 25 additions & 51 deletions

File tree

backend/services/redis.ts

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -124,83 +124,56 @@ const getRedisClient = (): RedisClient | undefined => {
124124
return client
125125
}
126126

127-
const getRedisSubscriberClient = (): RedisClient | undefined => {
127+
const getRedisSubscriberClient = async (): Promise<RedisClient | undefined> => {
128128
if (redisSubscriberClient) {
129129
return redisSubscriberClient
130130
}
131131
if (NEXUS_REFLECTION ?? isTest) {
132132
return
133133
}
134134

135-
const useSentinel = REDIS_SENTINELS && REDIS_SENTINEL_MASTER_NAME
136-
137-
let client: RedisClient
138-
139-
if (useSentinel && REDIS_SENTINELS && REDIS_SENTINEL_MASTER_NAME) {
140-
const sentinels = REDIS_SENTINELS.split(",").map((sentinel: string) => {
141-
const [host, port] = sentinel.trim().split(":")
142-
return { host, port: parseInt(port) ?? 26379 }
143-
})
144-
145-
const sentinelClient = createSentinel({
146-
name: REDIS_SENTINEL_MASTER_NAME,
147-
sentinelRootNodes: sentinels,
148-
nodeClientOptions: {
149-
password: REDIS_PASSWORD,
150-
database: REDIS_DB,
151-
socket: {
152-
reconnectStrategy: redisReconnectStrategy("Redis Subscriber"),
153-
},
154-
},
155-
})
156-
157-
sentinelClient.on("error", (err: any) => {
158-
_logger.error(`Redis Sentinel subscriber error`, err)
159-
})
160-
sentinelClient.on("ready", () => {
161-
_logger.info(
162-
`Redis Sentinel subscriber connected to master: ${REDIS_SENTINEL_MASTER_NAME}`,
163-
)
164-
})
165-
166-
sentinelClient.connect().catch((err: any) => {
167-
_logger.error(`Redis Sentinel subscriber connection failed`, err)
168-
})
135+
// Wait for main client to be ready first
136+
const mainClient = getRedisClient()
137+
if (!mainClient?.isOpen) {
138+
_logger.info(
139+
"Waiting for main Redis client to be ready before creating subscriber",
140+
)
141+
return
142+
}
169143

170-
client = sentinelClient as RedisClient
171-
} else {
144+
try {
172145
let url = (REDIS_URL && REDIS_URL.trim()) || "redis://127.0.0.1:6379"
173146
if (url && !url.startsWith("redis://") && !url.startsWith("rediss://")) {
174147
url = `redis://${url}`
175148
}
176149
if (url && !url.includes(":") && !url.includes("/")) {
177150
url = `${url}:6379`
178151
}
179-
const regularClient = createClient({
152+
153+
const subscriber = createClient({
180154
url,
181155
password: REDIS_PASSWORD,
182156
database: REDIS_DB,
183157
socket: {
184158
reconnectStrategy: redisReconnectStrategy("Redis Subscriber"),
185159
},
186-
})
160+
}) as RedisClient
187161

188-
regularClient.on("error", (err: any) => {
162+
subscriber.on("error", (err: any) => {
189163
_logger.error(`Redis subscriber error`, err)
190164
})
191-
regularClient.on("ready", () => {
165+
subscriber.on("ready", () => {
192166
_logger.info(`Redis subscriber connected to: ${url}`)
193167
})
194168

195-
regularClient.connect().catch((err: any) => {
196-
_logger.error(`Redis subscriber connection failed`, err)
197-
})
169+
await subscriber.connect()
198170

199-
client = regularClient as RedisClient
171+
redisSubscriberClient = subscriber
172+
return redisSubscriberClient
173+
} catch (err) {
174+
_logger.error("Failed to create Redis subscriber client", err)
175+
return
200176
}
201-
202-
redisSubscriberClient = client
203-
return client
204177
}
205178

206179
export { getRedisSubscriberClient }

backend/wsServer.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,13 @@ const createSubscriber = async () => {
135135
return
136136
}
137137

138-
while (!getRedisSubscriberClient()?.isOpen) {
139-
logger.info("Waiting on Redis subscriber client to be created...")
138+
// Wait for main Redis client to be ready
139+
while (!getRedisClient()?.isOpen) {
140+
logger.info("Waiting on main Redis client to be ready...")
140141
await new Promise((resolve) => setTimeout(resolve, 100))
141142
}
142143

143-
subscriber = getRedisSubscriberClient()
144+
subscriber = await getRedisSubscriberClient()
144145

145146
if (!subscriber) {
146147
logger.error("Failed to get Redis subscriber client")

0 commit comments

Comments
 (0)