Как сказал Codebreaker007, я бы тоже предпочел мультиплексирование потоков HTTP2. Он специально разработан, чтобы обойти проблему слишком большого количества одновременных соединений.
Однако, если вы застряли с HTTP1.x, я не думаю, что вам не повезло. Можно объединить потоки таким образом, чтобы клиентская часть могла деструктурировать и управлять отдельными потоками, хотя по общему признанию это требует немного больше работы, и вам, возможно, придется прибегнуть к опросу на стороне клиента.
Идея состоит в том, просто - определить действительно простую структуру данных:
[streamCount
len1
data1
len2
data2
...]
Байт 0 ~ 3: 32-bit unsigned int
количество объединенных потоков
байт 4 ~ 7: 32-bit unsigned int
длина данных потока 1
байт 8 ~ 8 + len1: binary
данные потока 1
Байт 8 + len1 + 1 ~ 8 + len1 + 4: длина данных потока 2
...
Каждый data
может иметь длину 0, и в этом случае обрабатывается не иначе.
На стороне клиента непрерывно опрашивайте для получения дополнительных данных, ожидая эту структуру данных. Затем деструктурируйте его и направьте данные в буфер отдельных потоков. Тогда вы все равно сможете управлять потоками компонентов по отдельности.
На стороне сервера кэшируйте данные из отдельных потоков компонентов в памяти. Затем в каждом ответе очищайте кеш, составляйте эту структуру данных и отправляйте.
Но, опять же, это очень гипсовое решение. Я бы также порекомендовал использовать поток HTTP2, но это был бы разумный запасной вариант.