Никаких setTimeout точно.
spoilerВо-первых: setTimeout ничего не гарантирует, кроме того что он не сработает раньше указанного интервала(зато может гораздо позже).
Во-вторых: это абсолютно ненадёжно, т.к. любой перезапуск и всё пропало.
В-третьих: это очень жирно по ресурсам.
Просто при каждом поступающем сообщении создаёте задачу на временную метку(можно с помощью совета
Станислав Макаров) если такой ещё нет, которая в указанное время запросит все записи с такой меткой и выполнит с ними нужное действие.
Метку и, соответственно, запрос можно создавать с округлением в размере допуска.
В базе естественно всё это дело надо индексировать и складывать для удобства таких запросов.