The way I've done this in the past has been to ping a custom endpoint on a cron event.
You need to package a user context with the event so that events are triggered as the logged in user, or write your event handlers to not care that they'll be logged out.
Another possibility is to have the event dispatcher use php-cli on cron, instead of php-fpm or whatever. That means it won't fall foul of any timeouts.
We could even use the existing Known CLI interface as part of this... so the async queue writes to a database table, and then the dispatcher running on a minute cron will pop the head message and dispatch.