Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimización de claimUserTickets: Mejora de rendimiento y refactorización #273

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

TextC0de
Copy link
Collaborator

Este PR optimiza la función claimUserTicket, mejorando su rendimiento y simplificando su lógica.
Los cambios principales incluyen:

  1. Eliminación de verificaciones redundantes:

    • Se eliminó la verificación inicial de la cantidad de tickets disponibles.
    • Se mantiene la verificación final para garantizar la integridad de los datos.
  2. Paralelización de operaciones:

    • Se utilizan Promise.all para ejecutar consultas en paralelo, reduciendo el tiempo de espera.
  3. Optimización de consultas a la base de datos:

    • Se reemplazaron múltiples consultas individuales por consultas en lote más eficientes.

Detalle pruebas de rendimiento

Se realizaron 15 iteraciones de los tests encontrados en src/schema/userTickets/tests/claimUserTicket
Se hizo un análisis del rendimiento de los tests y estos fueron los resultados.

Versión main (actual en producción):

  • Duración promedio: 3.93 segundos
  • Rango: 3.82 - 4.29 segundos

Nueva versión (textcode/improve-purchase-order-performance):

  • Duración promedio: 3.89 segundos
  • Rango: 3.75 - 4.05 segundos

Mejora de rendimiento: 1.02%

Resumen de pruebas de rendimiento

La nueva versión muestra una mejora ligera pero consistente en el rendimiento.

Aunque la diferencia es pequeña en los tests actuales, es importante notar que:

  1. La mejora se mantiene a lo largo de múltiples ejecuciones.
  2. Los tests actuales operan con una cantidad limitada de tickets, lo que podría estar subestimando el impacto de la optimización en producción con mayor volumen de datos.
  3. Las optimizaciones realizadas, especialmente la paralelización de operaciones con Promise.all y la reducción de consultas a la base de datos, deberían proporcionar beneficios más significativos en entornos de producción con mayor carga.
  4. La reducción de consultas a la base de datos se podría transmitir en menor coste operativo.

Cambios en los tests:

  • Se actualizó el mensaje de error esperado en el test "Should NOT allow claiming > If we would be going over ticket quantity" para reflejar el nuevo comportamiento.

Copy link

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 79.9% 13663 / 17098
🔵 Statements 79.9% 13663 / 17098
🔵 Functions 75.19% 379 / 504
🔵 Branches 81% 1002 / 1237
File Coverage
File Stmts % Branch % Funcs % Lines Uncovered Lines
Changed Files
src/datasources/db/userTickets.ts 100% 100% 100% 100%
src/schema/userTickets/helpers.ts 88.92% 79.48% 100% 88.92% 52-57, 62-67, 70-75, 86-91, 136-137, 164-165, 216-217, 251-252
src/schema/userTickets/mutations.ts 85.91% 70.52% 100% 85.91% 99-100, 146-147, 169-170, 211-212, 223-224, 235-236, 284-285, 296-301, 314-319, 322-327, 375-382, 394-399, 466, 493-494, 501-526, 540, 557-558, 579-580, 626-631, 634-639
Generated in workflow #1171

ticketIds,
},
});
const [events, tickets] = await Promise.all([
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se paralelizaron las consultas de eventos y tickets usando Promise.all.

userId: USER.id,
logger,
}),
trx.query.ticketsSchema.findMany({
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se eliminó el bucle for que iteraba sobre cada ticket. Ahora procesamos los tickets en lote, lo que reduce el número de consultas a la base de datos y mejora el rendimiento.

.execute();

// Bulk query for existing ticket counts
const finalTicketsCount = await trx
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reemplazamos múltiples consultas individuales por una única consulta en lote para obtener el recuento de tickets. Esto reduce la carga en la base de datos y mejora el tiempo de respuesta.

// If the ticket template has a quantity field, means there's a
// limit to the amount of tickets that can be created. So we check
// if we have enough tickets to fulfill the purchase order.
if (ticketTemplate.quantity) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se eliminó este check inicial ya que estamos haciendo un check final en el recuento de los userTickets existentes.

Esto mejora el rendimiento para el caso de uso más común de éxito en el que no se rebasa la cantidad máxima de stock

userTicketsSchema.ticketTemplateId,
ticketTemplates.map((t) => t.id),
),
inArray(userTicketsSchema.approvalStatus, [
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aquí me basé en el código anterior en el que se tomaban en cuenta solo estos dos estados, approved y pending, pero tal vez deberíamos tambien tomar en cuenta a:

  • Gifted
  • Gifted accepted
  • Not required

¿Que piensan?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant