Skip to content

Events

Este documento detalla los mecanismos de mensajería utilizados en el microservicio Inventory Manager, incluyendo el propósito de cada cola, el formato de los mensajes, los servicios que producen y consumen cada cola, y cómo se manejan errores o reintentos.

Inventory Manager utiliza AWS Simple Notification Service (SNS) para implementar un sistema de mensajería basado en el patrón publicador/suscriptor. Este sistema permite notificar a otros servicios sobre cambios en el inventario, como entradas y salidas de productos.

Las notificaciones se envían a temas SNS FIFO (First-In-First-Out), que garantizan que los mensajes se entreguen en el orden en que se publican y que no haya duplicados.

Nombre: inventory-manager-input-transaction-topic.fifo

ARN en Producción:

arn:aws:sns:us-east-1:849786826922:inventory-manager-input-transaction-topic.fifo

ARN en Staging:

arn:aws:sns:us-east-2:529305108461:inventory-manager-input-transaction-topic.fifo

Propósito: Notificar a otros servicios cuando se registra una entrada de inventario.

Productores:

  • Caso de uso RegisterInput a través del observador TransactionEmitter y el despachador SnsInventoryEventDispatcher

Formato del mensaje:

export interface InputTransactionMessage {
type: 'InputTransaction'
data: {
entryId: string
transactionId: string
productId: string
locationId: string
locationType: LocationType
containerId?: string
stock: number
description: string
transactionQuantity: number
timestamp: string
expirationDate?: string
lot?: string
}
context: {
country: string
warehouse: string
}
}

Nombre: inventory-manager-output-transaction-topic.fifo

ARN en Producción:

arn:aws:sns:us-east-1:849786826922:inventory-manager-output-transaction-topic.fifo

ARN en Staging:

arn:aws:sns:us-east-2:529305108461:inventory-manager-output-transaction-topic.fifo

Propósito: Notificar a otros servicios cuando se registra una salida de inventario.

Productores:

  • Caso de uso RegisterOutput a través del observador TransactionEmitter y el despachador SnsInventoryEventDispatcher

Formato del mensaje:

export interface OutputTransactionMessage {
type: 'OutputTransaction'
data: Array<{
entryId: string
transactionId: string
productId: string
locationId: string
locationType: LocationType
containerId?: string
description: string
stock: number
transactionQuantity: number
timestamp: string
expirationDate?: string
lot?: string
}>
context: {
country: string
warehouse: string
}
}

El manejo de errores y reintentos se implementa de la siguiente manera:

  1. Registro de errores:

    • Todos los errores de publicación se registran utilizando el sistema de logging.
    • Ejemplo en src/app/observers/emitters/transaction.ts:
      this.eventDispatcher.emitInputRegisterEvent(data).catch((err) => {
      logger.error({
      event: TransactionEmitter.name,
      err,
      msg: (err as Error).message,
      })
      })
  2. Deduplicación:

    • Los temas FIFO garantizan que no haya mensajes duplicados.
    • Se utiliza el ID de transacción como ID de deduplicación:
      const deduplicationId = event.transaction.id.toString()
  3. Agrupación de mensajes:

    • Los mensajes se agrupan por EAN del producto para garantizar el orden dentro de cada grupo:
      const groupId = event.entry.product.ean.toString()