Cómo evitar notificaciones push duplicadas: análisis en profundidad de la funcionalidad CID

En los sistemas de notificaciones push, las notificaciones push duplicadas son un problema habitual, especialmente en escenarios con redes inestables o reintentos del sistema. En este artículo se analiza en profundidad la funcionalidad de Client ID (CID), que permite aprovechar este mecanismo para evitar eficazmente las entregas duplicadas de mensajes.

Funcionalidad CID en notificaciones push inmediatas

Funciones principales

CID es un parámetro opcional que se utiliza para identificar una solicitud de push específica. Cuando una solicitud se repite con el mismo CID:

  • El sistema devuelve el msg_id del push anterior que se haya realizado correctamente
  • Evita que los mensajes se envíen repetidamente a los usuarios
  • Proporciona garantías de idempotencia (la misma operación tiene el mismo efecto cuando se ejecuta varias veces)

Características clave

Funcionalidad Descripción
Periodo de validez 1 hora
Requisitos de formato Caracteres alfanuméricos, guiones bajos, guiones; longitud ≤ 64 caracteres
Unicidad Debe ser único para la misma appkey
Escenarios compatibles Envíos individuales y envíos por lotes

Casos de uso

  1. Reintentos de red: Reintentar los envíos con el mismo CID cuando la red sea inestable
  2. Garantía de idempotencia: Garantizar que el mismo mensaje no se envíe repetidamente
  3. Seguimiento de solicitudes: Realizar el seguimiento del estado de envíos específicos mediante el CID

Ejemplos de solicitud

Envío individual con CID

curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push \ -H "Content-Type: application/json" \ -u "AppKey:MasterSecret" \ -d '{ "options": { "cid": "order-notify-20230701-001", "time_to_live": 60 } }'
              
              curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push \
  -H "Content-Type: application/json" \
  -u "AppKey:MasterSecret" \
  -d '{
    "options": {
      "cid": "order-notify-20230701-001",
      "time_to_live": 60
    }
  }'

            
Este bloque de código se muestra en una ventana flotante

Envío por lotes con CID

curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push/batch/regid \ -H "Content-Type: application/json" \ -u "AppKey:MasterSecret" \ -d '{ "requests": [ { "options": { "cid": "user-12345-notification", "time_to_live": 60 } } ] }'
              
              curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push/batch/regid \
  -H "Content-Type: application/json" \
  -u "AppKey:MasterSecret" \
  -d '{
    "requests": [
      {
        "options": {
          "cid": "user-12345-notification",
          "time_to_live": 60
        }
      }
    ]
  }'

            
Este bloque de código se muestra en una ventana flotante

Gestión de respuestas

Primer envío correcto

{ "msg_id": "2460001" }
              
              {
  "msg_id": "2460001"
}

            
Este bloque de código se muestra en una ventana flotante

Envío repetido con el mismo CID

{ "msg_id": "2460001" // Returns the msg_id from the first push }
              
              {
  "msg_id": "2460001" // Returns the msg_id from the first push
}

            
Este bloque de código se muestra en una ventana flotante

Formato de CID no válido

{ "error": { "code": 23003, "message": "CID format does not meet requirements" } }
              
              {
  "error": {
    "code": 23003,
    "message": "CID format does not meet requirements"
  }
}

            
Este bloque de código se muestra en una ventana flotante

Descripción del código de error

Código de error Descripción Resolución Código de estado HTTP
21003 Formato de CID no válido o excede el límite de longitud Verificar el cumplimiento del formato de CID; asegurarse de que la longitud del CID no supere los 64 caracteres 400

Mejores prácticas

  1. Usar CID en procesos críticos del negocio: Aplicar CID a mensajes como notificaciones de pago y alertas importantes
  2. Generar identificadores significativos: Usar formatos como business-entity-timestamp (p. ej., payment-12345-202307011030)
  3. Mecanismo de reintento de red: Reintentar con el mismo CID cuando se encuentren errores de red
  4. Distinguir identificadores en envíos por lotes: Usar CIDs únicos para cada solicitud en los envíos por lotes para facilitar el seguimiento
  5. Registro de CID en el cliente: Registrar los CID en el lado del cliente para la deduplicación de mensajes y las consultas de estado

Funcionalidad CID en tareas programadas

Funciones principales

CID también se aplica a la creación de tareas programadas, evitando la creación duplicada de las mismas tareas programadas:

  • Reutilizar el mismo CID devuelve el schedule_id creado previamente
  • Evita que el sistema cree tareas programadas duplicadas

Características clave

Funcionalidad Descripción
Periodo de validez 1 hora
Requisitos de formato Caracteres alfanuméricos, guiones bajos, guiones; longitud ≤ 64 caracteres
Unicidad Debe ser único para la misma appkey

Ejemplo de solicitud

curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/schedules \ -H "Content-Type: application/json" \ -u "AppKey:MasterSecret" \ -d '{ "cid": "daily-reminder-202307", "trigger": { "daily": { "start": "2023-07-01", "time": "09:00:00" } } }'
              
              curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/schedules \
  -H "Content-Type: application/json" \
  -u "AppKey:MasterSecret" \
  -d '{
    "cid": "daily-reminder-202307",
    "trigger": {
      "daily": {
        "start": "2023-07-01",
        "time": "09:00:00"
      }
    }
  }'

            
Este bloque de código se muestra en una ventana flotante

Gestión de respuestas

Primera creación correcta

{ "schedule_id": "0123456789" }
              
              {
  "schedule_id": "0123456789"
}

            
Este bloque de código se muestra en una ventana flotante

Creación repetida con el mismo CID

{ "schedule_id": "0123456789" // Returns the schedule_id from the first creation }
              
              {
  "schedule_id": "0123456789" // Returns the schedule_id from the first creation
}

            
Este bloque de código se muestra en una ventana flotante

Mejores prácticas

  1. Identificación de tareas periódicas: Incluir información del ciclo en el CID (p. ej., weekly-report-2023w27)
  2. Resumen de parámetros de la tarea: Incluir un hash de parámetros críticos (p. ej., birthday-reminder-md5(params))
  3. Coordinación en sistemas distribuidos: Usar el mismo CID en múltiples instancias de servicio para evitar creaciones duplicadas
  4. Mecanismo de actualización de tareas: Usar un CID nuevo al modificar tareas

Flujo de procesamiento de EngageLab

graph TD
    A[Receive Request] --> B{Contains CID?}
    B -->|Yes| C[Query Redis]
    B -->|No| D[Normal Processing]
    C --> E{CID Exists?}
    E -->|Yes| F[Return Stored msg_id/schedule_id]
    E -->|No| G[Process Request]
    G --> H[Store CID → ID Mapping]
    H --> I[Return New ID]

Preguntas frecuentes

P: ¿Por qué el periodo de validez del CID es de 1 hora?
R: Es suficiente para cubrir escenarios típicos de reintento y, al mismo tiempo, evita el crecimiento ilimitado del almacenamiento. En procesos críticos, se puede ampliar el periodo de deduplicación mediante registros propios.

P: ¿Se puede usar el mismo CID con diferentes appkeys?
R: Sí. Los CID solo deben ser únicos para la misma appkey.

P: ¿CID garantiza unicidad global?
R: No. Solo debe ser único para la misma appkey; el sistema no requiere unicidad global.

P: ¿Cómo validar el formato de CID?
R: Usar la expresión regular: /^[a-zA-Z0-9_-]{1,64}$/

Resumen

Mediante el uso adecuado del parámetro CID, se puede:

  1. ✅ Evitar mensajes duplicados causados por reintentos de red
  2. ✅ Garantizar idempotencia para mensajes críticos del negocio
  3. ✅ Simplificar el seguimiento de mensajes en sistemas distribuidos
  4. ✅ Mejorar la fiabilidad general del sistema

Recomendaciones clave de implementación:

  • Añadir CID a mensajes críticos del negocio
  • Adoptar la convención de nomenclatura business-entity-time
  • Implementar lógica de deduplicación basada en CID en el lado del cliente
  • Supervisar los códigos de error relacionados con CID

Con las directrices de este artículo, se puede aprovechar eficazmente la funcionalidad CID para crear un sistema de notificaciones push más robusto y resolver por completo el problema de las notificaciones push duplicadas.

Icon Solid Transparent White Qiyu
Contacto