Либо ваши серверы должны иметь возможность искать местоположение клиентов (возможно, через базу данных, возможно, с помощью выделенного сервера адресов), либо вам нужно удалить случайность, используя подходы хэширования или некоторые другие неслучайные разбиения, как предложено Kru в комментариях. (В любом случае у вас есть проблемы, если сервер выходит из строя, но, возможно, это выходит за рамки вашего вопроса).
Затем ваши серверы должны иметь возможность пересылать сообщения на соответствующий другой сервер. Для них проще всего поддерживать сокетные соединения друг с другом.
Другой подход заключается в использовании системы очередей сообщений. Вы могли бы рассмотреть возможность использования высокопроизводительной системы без посредников, такой как ZeroMQ , которая предоставляет API, подобный сокету, но с более высокой пропускной способностью и отказоустойчивостью, а также более богатыми шаблонами обмена сообщениями. Продукты для обмена сообщениями более высокого уровня, вероятно, могут реализовать большую часть описываемой вами системы (обработка масштабируемости, адресация и т. Д.).
Возможно, вы сможете использовать существующий протокол, такой как XMPP , вместо того, чтобы изобретать собственную систему распределенного обмена сообщениями.