Итак, мы пытаемся поддерживать огромное количество одновременных подключений с мобильных устройств к нашему HTTP-серверу Erlang. Конечно, мобильные устройства могут иметь довольно прерывистые соединения, поэтому мы стараемся как можно быстрее сбрасывать мертвые соединения, чтобы избежать их перегрузок.
Теперь я не уверен, на каком уровне мы должны обнаруживать мертвые соединения. TCP имеет пакеты keepalive, которые требуют ACK. Поэтому в идеале мы будем отправлять пакет поддержки активности каждые 15 секунд, и если мы не получим ACK в течение следующих 15 секунд, мы прервем соединение. Тем не менее, я понятия не имею, возможно ли это даже в Эрланге. Кроме того, я думаю, что существует вероятность того, что некоторые NAT, маршрутизаторы Wi-Fi и мобильные сети получают подтверждение активности в течение определенного времени, исправьте меня, если я ошибаюсь. Так ли это, и если да, то есть ли альтернативный способ выполнения «сердцебиений» на уровне TCP?
Мы также попробовали пульс на уровне приложения - отправку \ n вниз по потоку HTTP. Однако даже при всех установленных параметрах Erlang, включая send_timeout, мы не получим никаких ошибок в течение примерно 5 минут при определенных обстоятельствах, таких как, например, мобильное устройство, отклоняющееся слишком далеко от его Wi-Fi-маршрутизатора.
Как лучше всего реализовать потоковое HTTP-соединение, чтобы сервер потерял связь как можно скорее после потери контакта? Любая помощь будет высоко ценится!