Каков предел задержки для отложенных сообщений RabbitMQ?

Java RabbitMQ

Когда я писал тему Spring Cloud Stream раньше, я специально представил ее.Как использовать отложенные сообщения RabbitMQ для реализации запланированных задач. В последнее время именно из-за разработки в процессе использования было обнаружено, что отложенное сообщение не имеет никакого эффекта, и сообщение потребляется напрямую. Поэтому я продолжил углубленное изучение причины проблемы и записал ее здесь для ссылки на детскую обувь, которая сталкивается с подобными проблемами.

выявить проблему

Поскольку не все сообщения имеют фактор, который не влияет на задержку сообщения, по характеристикам рассматриваемого сообщения можно приблизительно предположить, что время задержки может быть слишком большим, что может привести к сбою задержки сообщения. Чтобы проверить эту причину, сначала примите передстатьянапример, чтобы проверить, связано ли время задержки напрямую с проблемой.

Внесите небольшие изменения в интерфейс предыдущего примера использования отложенных сообщений (полный код можно получить в Git-репозитории в конце статьи) и добавьте параметр запросаdelayдля управления временем задержки:

@GetMapping("/sendMessage")
public String messageWithMQ(@RequestParam String message, @RequestParam Long delay) {
    log.info("Send: " + message);
    testTopic.output().send(MessageBuilder.withPayload(message).setHeader("x-delay", delay).build());
    return "ok";
}

Затем попробуйте сделать два запроса:

запрос 1: Задержка 5000 мс. После того, как сообщение отправлено в MQ, оно действительно задерживается на 5 секунд, прежде чем оно будет использовано без каких-либо проблем.

curl localhost:8080/sendMessage?message=hello&delay=5000

запрос 2: Задержка 1 год (31536000000 мс). После того, как сообщение отправлено в MQ, оно немедленно потребляется потребителем, и эффект задержки вообще отсутствует.

curl localhost:8080/sendMessage?message=hello&delay=31536000000

Краткое описание проблемы

После выяснения причины проблемы необходимо сделать некоторые четкие ограничения на функцию (лимит времени задержки), чтобы избежать повторения подобных проблем. Идя глубже, сбой здесь в основном напрямую связан со временем истечения срока действия (TTL) сообщения. В RabbitMQ время истечения срока действия сообщения должно быть неотрицательным 32-битным целым числом, то есть: 0

Здесь мы можем попробовать следующие два запроса, установив время задержки на 4294967295 и 4294967296 соответственно:

curl localhost:8080/sendMessage?message=hello&delay=4294967295
curl localhost:8080/sendMessage?message=hello&delay=4294967296

Можно обнаружить, что когда время задержки составляет 4294967295 миллисекунд, задержанное сообщение работает нормально; когда время задержки составляет 4294967296 миллисекунд, сообщение потребляется напрямую без эффекта задержки.

Поэтому, когда мы используем функцию отложенного сообщения RabbitMQ, мы должны обратить внимание на ее предел задержки в 4294967296 миллисекунд. Если ваши бизнес-требования превысят это критическое значение, вы должны избегать этой ямы и использовать другие методы для реализации задач, которые необходимо откладывать или выполнять регулярно.

пример кода

Читатели примера в этой статье могут просмотреть проект stream-delayed-message в следующем репозитории:

Если вы заинтересованы в них, добро пожаловать, пометьте, подпишитесь, добавьте в избранное и вперед, чтобы поддержать!

Добро пожаловать, чтобы обратить внимание на мой общедоступный номер: Programmer DD, получить эксклюзивные учебные ресурсы и ежедневный толчок галантерейных товаров. Если вас интересует мой рекомендуемый контент, вы также можете подписаться на мой блог:didispace.com