With the large amount of parallel requests sometimes its recommended to use Fibers instead of Threads as they are faster to fire and lighter in memory usage.
The most popular solution is EM-synchrony and you can use EM::Synchrony::Iterator for job scheduling and balancing.
Be aware that you should use according EM-libraries like "em-synchrony/em-http" for compatibility with EM-synchrony.
You can check this blogpost for more insights.