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