Исходя из недавнего опыта я бы предложил поднять несколько серверов со
Swoole (писать на PHP а не Java) Например, по 200к соединений на каждый (с белыми IP).
DNS round robin: одно имя указывает на несколько IP и надеяться, что равномерно раскидает подключения. Или прятаться за load balancer'ом, но тогда каждый сетевой интерфейс примет меньшее число соединений, не более 65к в теории, меньше на практике.
Использовать
Redis в качестве PubSub брокера. Из каждого сервера подписаться на сообщения из Redis.
При подключении WebSocket клиента его подписки хранить в
Memory Table того сервера, куда он подключился. Ключ
$fd
подключения, в колонках держать 1/0 на каждый из 1000 каналов, или просто перечислить номера каналов через разделитель в единственном строковом поле.
При поступлении сообщения (новой цифры в одной из подписок) в цикле обходить таблицу (все подключения этого сервера) и отправлять сообщение тем, у кого включена данная подписка.