Веб-версияОткрыть в Telegram

ПостЗачем Redis для задач по расписанию?

13 августа 2025
J
Java: fill the gaps
Зачем Redis для задач по расписанию? На прошлой неделе писала про задачки по расписанию и аннотацию Scheduled. Сегодня расскажу интересный кейс, когда для такой задачи используется очередь Redis. Типичная реакция джавистов: "Чего? Как? Зачем???"🤯 Сходу даже сложно придумать, как использовать очередь для отложенных задач. Тем не менее это базовый паттерн в питоне. Как вы помните по прошлому посту, сервис на питоне работает в одном потоке ОС. Чтобы задачки выполнялись параллельно по-настоящему, запускаются дополнительные процессы. Как это организовано для отложенных задач: ✍️ Основной процесс описывает задачу, которую нужно выполнить по расписанию ✍️ Отдельный сервис-планировщик следит, когда наступит указанное время ✍️ В нужный момент задача сериализуется и отправляется в очередь Redis ✍️ Сервис-исполнитель забирает задачу из очереди и выполняет ✍️ При необходимости результат отправляется обратно в Redis, и основной сервис его забирает Основной сервис и сервис-исполнитель - это разные процессы, у них нет разделяемой памяти. Redis нужен, чтобы передать задачу из одного процесса в другой. Ну и как бонус — распределить задачки между исполнителями. Очередь для такой схемы очень упрощает реализацию. Планировщик просто кидает задачу в очередь. Процесс-исполнитель ничего не выбирает, не сортирует, просто достаёт задачу из начала, и она тут же удаляется. Минимум усилий с обеих сторон. Плюсы и минусы питоновской реализации: 👎 Больше компонентов, больше инфраструктуры 👎 В рэдисе добавляется служебная очередь для обмена данными 👎 Проблемы конкретных библиотек влияют на инфраструктуру Например, если задача запланирована НЕ в ближайшие полчаса, она может выполниться несколько раз. Проблема известная и лечится настройками редиса. Но есть большой плюс: ✅ Низкая когнитивная сложность. В джаве возможны варианты, поэтому надо думать, выбирать и знать о возможных проблемах. В питоне решение одно. Неважно, сколько сервисов и задач, задачи всегда выполняются в отдельном процессе. Зачем изучать подходы в других языках? Как я писала в прошлом посте, модель многопоточности влияет на архитектуру и инфраструктуру. У каждого языка свои "стандартные решения". Если сервис написан на Python, надо подкручивать определенные настройки Redis. В JS модель многопоточности как в питоне, но задачи по расписанию чаще реализуют через crontab и Mongo. Это непрозрачно, повышает связность и сложность. Но таковы реалии. Когда вы техлид или высокоранговый сеньор в большой компании, придется взаимодействовать с другими стеками и понимать, что там происходит. И, конечно, инженерный интерес! У разных инструментов разные подходы, свои преимущества и ограничения. Разбираться, как и за счёт чего решаются задачи, оценивать трейдоффы и выбирать подходящее решение очень интересно. Такие задачки - мои самые любимые🥰
38 · 9.4K ·

Рядом в ленте

JJava: fill the gapsКак устроена многопоточность в разных языках Если хотите сделать доклад для конференции — сравните подходы к чему-нибудь в разных языках. Такой доклад можно проJJava: fill the gapsОпрос
это сообщение
JJava: fill the gapsОпросJJava: fill the gapsКак создать неблокирующий индекс в Postgres? Сегодня расскажу про опцию CONCURRENTLY при построении индекса. Идея проста. Обычный CREATE INDEX блокирует изменен

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем