catch redis client error and continue the process

This commit is contained in:
Hongbo Wu 2024-01-05 15:20:42 +08:00
parent 75d9206262
commit ccd4f2d3f0
3 changed files with 34 additions and 13 deletions

View file

@ -160,7 +160,12 @@ const main = async (): Promise<void> => {
// redis is optional
if (env.redis.url) {
redisClient.on('error', (err) => {
console.error('Redis Client Error', err)
})
await redisClient.connect()
console.log('Redis Client Connected:', env.redis.url)
}
const { app, apollo, httpServer } = createApp()

View file

@ -416,8 +416,15 @@ export const setRecentlySavedItemInRedis = async (
// save the url in redis for 8 hours so rss-feeder won't try to re-save it
const redisKey = `recent-saved-item:${userId}:${url}`
const ttlInSeconds = 60 * 60 * 8
return redisClient.set(redisKey, 1, {
EX: ttlInSeconds,
NX: true,
})
try {
return redisClient.set(redisKey, 1, {
EX: ttlInSeconds,
NX: true,
})
} catch (error) {
logger.error('error setting recently saved item in redis', {
redisKey,
error,
})
}
}

View file

@ -63,11 +63,15 @@ const feedFetchFailedRedisKey = (feedUrl: string) =>
const isFeedBlocked = async (feedUrl: string, redisClient: RedisClient) => {
const key = feedFetchFailedRedisKey(feedUrl)
const result = await redisClient.get(key)
// if the feed has failed to fetch more than certain times, block it
const maxFailures = parseInt(process.env.MAX_FEED_FETCH_FAILURES ?? '10')
if (result && parseInt(result) > maxFailures) {
return true
try {
const result = await redisClient.get(key)
// if the feed has failed to fetch more than certain times, block it
const maxFailures = parseInt(process.env.MAX_FEED_FETCH_FAILURES ?? '10')
if (result && parseInt(result) > maxFailures) {
return true
}
} catch (error) {
console.error('Failed to check feed block status', feedUrl, error)
}
return false
@ -75,11 +79,16 @@ const isFeedBlocked = async (feedUrl: string, redisClient: RedisClient) => {
const blockFeed = async (feedUrl: string, redisClient: RedisClient) => {
const key = feedFetchFailedRedisKey(feedUrl)
const result = await redisClient.incr(key)
// expire the key in 1 day
await redisClient.expire(key, 24 * 60 * 60, 'NX')
try {
const result = await redisClient.incr(key)
// expire the key in 1 day
await redisClient.expire(key, 24 * 60 * 60, 'NX')
return result
return result
} catch (error) {
console.error('Failed to block feed', feedUrl, error)
return null
}
}
export const isContentFetchBlocked = (feedUrl: string) => {