У меня используется первый подход, но с небольшими изменениями.
- Сервер раз в 30 секунд рассылает мультикаcт сообщение по UDP, в котором есть UUID сервера и его IP.
- Сервер каждый раз генерирует новый UUID при старте.
- Клиент запоминает UUID, и если он изменился (сервер перезагружен), то переподключается к серверу по TCP.
Клиенты у меня set-top-box-ы в количестве до 10000 штук. Простой комп на интел-атом тянет 100-300 клиентов (больше просто к атому не подключал) без каких либо проблем, загрузка CPU около нуля, так как клиенты просто устанавливают соединения и ждут команд. Для больших инсталляций покупаем заказчику сразу сервер с iCore или Xeon, эти тянут гораздо больше.
Все ПО сервера написано на python, сам сервер реализован на twisted + cyclone. Клиенты - javascript :-) и делфи :-) и питон.