У меня есть приложение чата, использующее node.js и socket.io, которое хранит информацию о пользователях в Redis и MongoDB. Когда пользователь впервые подключается к серверу сокетов, для него создается идентификатор пользователя, и этот идентификатор (вместе с его именем пользователя) сохраняется в объекте сокета. Полная информация о пользователе (включая аватар, электронную почту и т. Д. c) хранится в MongoDB, а часть также кэшируется в Redis. Когда клиент отключается от сервера сокетов, событие обрабатывается следующим обработчиком событий:
const handleDisconnect = async () => {
const {userId, username} = socket;
if (userId && username) {
try {
delete socket.userId;
delete socket.username;
await redisClient.del(`user:${userId}`);
await User.findByIdAndDelete(userId);
} catch (err) {
console.log(err);
}
}
};
Теперь, поскольку команды, удаляющие пользователя из Redis и Mon go, являются асинхронными c, по крайней мере в теории есть вероятность, что они могут бросить. Например, если команда удаления из Redis выбрасывает, то приведенная ниже команда не будет запущена, и пользователь не будет удален из MongoDB.
То же самое может произойти даже при добавлении пользователя в эти базы данных в первую очередь, так как команды базы данных всегда могут теоретически не выполняться и приводить вещи в несогласованное состояние.
Существует ли стандартный способ обработки таких ситуаций?
Должен ли я реализовать лучшую обработку исключений, чтобы я перехватывал все возможные ошибки и продолжал повторять попытки выполнения команд базы данных, пока они не будут выполнены успешно?
Или я должен реализовать какую-то сборку мусора, которая периодически проходит через базы данных и очищает документы, которые не были успешно удалены?