implementación rocketmq de cola de retraso
Implementación específica: rocketmq envía retraso Cuando Al enviar un mensaje, primero envíe el mensaje a la cola especificada de acuerdo con el período de retraso (rocketmq almacena los mensajes en cada período de retraso en la misma cola) y luego gire estas colas a través de temporizadores para ver si el mensaje ha caducado. , el mensaje se envía a la cola del tema especificado. Si el mensaje caduca, el mensaje se envía a la cola del tema especificado. La ventaja de esto es que el tiempo de retraso de los mensajes en la misma cola es el mismo. Otra ventaja es que los mensajes en la cola se ordenan de forma ascendente. ordene según el tiempo de vencimiento del mensaje Para decirlo sin rodeos, la cuestión es que cuantos más mensajes haya en la cola, antes será el tiempo de vencimiento
Diagrama de flujo
Análisis de fuente:
Si desea obtener más información, puede echar un vistazo a la clase ScheduleMessageService
delayLevelTable define la relación entre el nivel de retraso y el tiempo de retraso. offsetTable almacena el desplazamiento del consumo de la cola correspondiente al nivel de retraso.
Utilice un temporizador para iniciar una tarea programada. Uso Un temporizador encapsula cada cola de análisis.
Utilice un temporizador para iniciar una tarea programada, encapsule cada cola de escaneo en una tarea y luego agréguela al temporizador.
Cada tarea de escaneo obtiene principalmente todos los elementos caducados en la cola. y enviarlo al tema especificado, mientras se elimina el mensaje en la cola retrasada
Resumen
Ventajas: el diseño es simple y todos los mensajes caducados en la cola se envían al tema especificado Tema: El diseño es simple, coloque todos los mensajes con el mismo tiempo de retraso en un temporizador
Desventajas: el temporizador es un hilo único, por lo que si la cantidad de mensajes retrasados es muy grande, es posible que el hilo único no podrá procesarlo, lo que provocará que el mensaje caduque. Aún no se puede enviar.
Mejora: puede usar un temporizador para cada cola de retraso o usar temporizadores para escanear y luego eliminar mensajes en la cola de retraso. O utilice un temporizador para escanear y luego agregue un grupo de subprocesos para procesar los paquetes, lo que puede mejorar la eficiencia
.