Как опрос не превосходит pu sh для обмена сообщениями? - PullRequest
0 голосов
/ 20 февраля 2020

Скажите, что вы разрабатываете фон API веб-сервера для своего сайта. Одной из функций вашего сайта является возможность создавать посты и заставлять людей отвечать на них. Одной из желаемых функций является автоматическое отображение ответов без обновления страницы sh.

На данный момент возникает вопрос между опросом и отправкой. Таким образом, клиент может просто делать новый запрос каждые 15-45 секунд, чтобы увидеть, есть ли какие-либо новые сообщения. Если это так, сервер может вернуть их. Затем клиент может обновить свою страницу.

Тем не менее, тонны статей в Интернете говорят о том, что опрос неэффективен, не может масштабироваться и его лучше заменить новыми решениями для чата, такими как WebSockets или Server Sent Events.

Меня это очень смущает по нескольким причинам:

1) Принятие WebSockets, похоже, не устраняет необходимость опроса, за исключением того, что теперь за него отвечает сервер. В самом деле, если вы не включите пульс (который по сути является клиентом и сервером, обменивающимся сообщениями каждые 30 секунд или около того), соединение будет разорвано.

2) При использовании WebSockets / SSE сложность серверной архитектуры резко возрастает. , Допустим, у вас есть два пользователя, оба загружены в одно и то же сообщение, но подключены к двум различным внутренним серверам. Теперь, когда на сообщение отправляется ответ через сервер A, его необходимо каким-то образом перенаправить на сервер B. Либо два сервера должны быть подключены напрямую, либо оба они должны быть подключены к другому централизованному серверу PubSub, например, Redis.

3) Теперь, если вы представите что-то вроде Redis для его возможности PubSub, у вас больше не будет API-интерфейса без сохранения состояния. Помимо необходимости поддерживать постоянные соединения с каждым пользователем, теперь он также должен поддерживать соединение с Redis. Дополнительное трение добавлено в том, что мы должны поддерживать все эти постоянные соединения и больше не иметь беззаботной жизни, имея бэкэнды без состояния, которые могут произвольно вращаться вверх и вниз.

4) Интуитивно, этот подход кажется менее масштабируемым также. Каждое сообщение должно проходить через этот единственный сервер Redis PubSub и передаваться на любой другой внутренний сервер в случае, если есть какие-либо пользователи, подключенные к этому внутреннему серверу, для которых это сообщение является релевантным. Я не очень понимаю, как это решение масштабируемо, когда каждое сообщение должно проходить через один сервер и отправляться на каждый другой сервер.

5) И наконец, поддержание постоянных соединений с сохранением состояния значительно сужает количество потенциальных клиентов вы можете обслуживать с одной машины? В зависимости от количества портов TCP на вашем сервере, вы можете поддерживать только несколько десятков тысяч соединений с сокетами, тогда как если бы вы не имели состояния, вы могли бы многократно обрабатывать это число, не используя эти ограниченные TCP. порты.

По сути, я запутался, почему бэкэнды без сохранения состояния не имеют превосходства. Вы должны опрашивать независимо (с сердцебиением с сохранением состояния или с помощью простого извлечения без сохранения состояния). Архитектурный сервер явно превосходит интерфейс без сохранения состояния, поскольку вам не нужно поддерживать какие-либо соединения с пользователями или каким-либо централизованным хранилищем, а приложение может легко масштабироваться. Наконец, не все сообщения должны проходить через централизованный сервер PubSub и (часто без необходимости!) Перенаправляться на любой другой сервер, который может требовать сообщения. Похоже, что stateful - это «проигрыш-проигрыш-проигрыш», но, тем не менее, это универсально рекомендуемый подход, для которого я не понимаю, почему, и надеялся, что кто-то может объяснить.

...