Re enqueuing messages into the same queue might not be the best route. It can be confusing in the event an issue arises, seeing a full queue (should it be full? or is the consumer not processing them?). The messages probably should only enter the queue when it should be processed within 15 min. Else you will be invoking thousands of invocations to simply re enqueue a message.
I would do the following:
Lambda worker 1: Receives new message, if item should be delayed more than 15 min, store in DynamoDB, else enqueue message.
Lambda worker 2: Every n(5?) minutes, poll DynamoDB for messages that should be processed within the next 15 minutes, enqueue the messages with the correct delay.
Simply add a index so querying for messages by execution date is fast, this should cover the ability to enqueue thousands of messages per second. If your throughput needs are higher than this, this may not be the best solution.