Estoy haciendo una aplicación de citas. Un usuario puede enviar solicitudes de fecha a otro usuario, las solicitudes de fecha se almacenarán en una colección diferente. Mientras envía el perfil de los usuarios, el servidor verifica si el usuario ha enviado la solicitud de fecha o no.
export async function parseUser(_user: any, current_user:UserInterface): Promise<UserProfile>{ if(!_user) return _user; const user: UserProfile = _user const now = moment(new Date()); const birthday = moment(_user.birthday); const years = moment.duration(now.diff(birthday)).asYears(); const task1 = DateRequest.findOne({request_sent_by: current_user.uid, request_sent_to: user.uid}); const task2 = DateRequest.findOne({request_sent_by: user.uid, request_sent_to: current_user.uid}); const [has_current_sent_date_request, has_this_user_sent_date_request] = await Promise.all([task1, task2]) user.age = Math.floor(years); user.is_dating = user.dates.includes(current_user.uid); user.has_saved = current_user.saved_users.includes(user.uid); user.has_current_sent_date_request = has_current_sent_date_request?true:false user.has_this_user_sent_date_request = has_this_user_sent_date_request?true:false return user } Esta función parseUser() toma datos de usuario sin procesar y calcula la edad, verifica si el usuario actual está saliendo con el usuario solicitado, verifica si el usuario solicitado ha enviado la solicitud de fecha al usuario actual y también verifica si el usuario actual ha enviado la solicitud de fecha al usuario solicitado.
console.time("time") const tasks = matching_users.map(async x => parseUser(x, res.locals.currentUser)) const parsed_users: UserProfile[] = await Promise.all(tasks) console.timeEnd("time") JSONReponse.success("success", parsed_users) matching_users tiene datos de usuario sin procesar que no incluyen la age, is_dating, has_sent_request
Aunque utilicé Promise.all() el código anterior tarda 3 segundos en completarse.
¿Hay alguna optimización o mejor manera de hacer esto?
Si sus tareas DateRequest.findOne se ejecutan en el mismo trabajador, se ejecutarán de manera secuencial. Cada trabajador tiene un solo hilo. Por lo tanto, todas las tareas en el mismo trabajador se ponen en cola y se procesan una a la vez. Si necesita que se ejecuten en paralelo, deberá asegurarse de que sean manejados por diferentes trabajadores. Esto agregará una sobrecarga de mensajería entre trabajadores. Sin embargo, mejorará el rendimiento si estas tareas se ejecutan durante el tiempo suficiente.
Aquí hay un par de artículos que tratan sobre subprocesos múltiples en node.js
Para que los subprocesos múltiples funcionen, el acceso a la base de datos también tendrá que ser seguro para subprocesos. En ese caso, también deberá asegurarse de que, sin importar cómo esté leyendo MongoDB , será seguro manejar el acceso simultáneo desde múltiples subprocesos.