- Notifications
You must be signed in to change notification settings - Fork179
Long polling#313
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Long polling#313
Changes fromall commits
Commits
Show all changes
13 commits Select commitHold shift + click to select a range
ef2d2f5
Long polling
jeneg7493e0d
Update 5-network/10-long-polling/article.md
jenegc19bd2e
Update 5-network/10-long-polling/article.md
jenegb1fbbca
Update 5-network/10-long-polling/article.md
jenegbaca155
Update 5-network/10-long-polling/article.md
jenegb8b4bcf
Update 5-network/10-long-polling/article.md
jeneg5af7500
Update 5-network/10-long-polling/article.md
jeneg4be5032
Update 5-network/10-long-polling/article.md
jenege27fdde
Update 5-network/10-long-polling/article.md
jenegda20417
Update 5-network/10-long-polling/article.md
jenegf16e06b
Update 5-network/10-long-polling/article.md
jeneg8fad01a
Update 5-network/10-long-polling/longpoll.view/browser.js
jeneg1b1169c
Update 5-network/10-long-polling/longpoll.view/server.js
jenegFile filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
88 changes: 44 additions & 44 deletions5-network/10-long-polling/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,98 +1,98 @@ | ||
#Тривале опитування | ||
Тривале опитування (Long polling) -- це найпростіший спосіб реалізувати постійне з’єднання із сервером, без використання спеціального протоколу, такого якWebSocketабо Server Side Events. | ||
Будучи дуже простим у реалізації, він також достатньо хороший у багатьох випадках. | ||
##Періодичне опитування | ||
Найпростіший спосіб отримати нову інформацію з сервера -- періодичне опитування. Тобто регулярні запити до сервера: "Привіт, я тут, у вас є якась інформація для мене?".Наприклад, раз на 10секунд. | ||
У відповідь сервер спочатку помічає собі, що клієнт онлайн, а по-друге -- надсилає пакет повідомлень, які він отримав до цього моменту. | ||
Це працює, але є і мінуси: | ||
1.Повідомлення передаються із затримкою до10секунд (між запитами). | ||
2.Навіть якщо повідомлень немає, сервер отримує запити кожні10секунд, навіть якщо користувач перейшов кудись в інше місце або сайт не використовується. З точки зору продуктивності, це може створювати велике навантаження. | ||
Отже, якщо ми говоримо про невеликий сервіс, підхід може бути життєздатним, але загалом він потребує вдосконалення. | ||
##Тривале опитування | ||
Так зване "тривале опитування" (Long polling) -- це набагато кращий спосіб опитування сервера. | ||
Також він дуже простий у реалізації та дозволяє отримувати повідомлення без затримок. | ||
Як це працює: | ||
1.На сервер надсилається запит. | ||
2.Сервер не закриває з’єднання, поки не з’явиться повідомлення для відправки. | ||
3.Коли з’являється повідомлення -- сервер відповідає ним на запит. | ||
4.Браузер негайно робить новий запит. | ||
Ситуація, коли браузер відправив запит і має відкрите з’єднання з сервером, є стандартною для цього методу. Лише після доставки повідомлення з’єднання із сервером закривається та відкривається нове. | ||
 | ||
Якщо з’єднання втрачено, скажімо, через помилку мережі, браузер негайно надсилає новий запит. | ||
Ось ескіз функції`subscribe`на стороні клієнта, яка виконує тривале опитування: | ||
```js | ||
async function subscribe() { | ||
let response = await fetch("/subscribe"); | ||
if (response.status == 502) { | ||
//Статус 502-- це помилка тайм-ауту підключення, | ||
//вона може статися, коли з’єднання було відкрито занадто довго, | ||
//і віддалений сервер або проксі-сервер закрили його. | ||
//У цьому випадку повторюємо підключення | ||
await subscribe(); | ||
} else if (response.status != 200) { | ||
//У разі помилки -- покажемо її | ||
showMessage(response.statusText); | ||
//Повторне підключення через одну секунду | ||
await new Promise(resolve => setTimeout(resolve, 1000)); | ||
await subscribe(); | ||
} else { | ||
//Отримуємо та показуємо повідомлення | ||
let message = await response.text(); | ||
showMessage(message); | ||
//Знову викликаємоsubscribe(), щоб отримати наступне повідомлення | ||
await subscribe(); | ||
} | ||
} | ||
subscribe(); | ||
``` | ||
Як бачите, функція`subscribe`виконує запит, потім чекає на відповідь, обробляє її та знову викликає сама себе. | ||
```warn header="Сервер має підтримувати багато відкритих з’єднань" | ||
Архітектура сервера повинна вміти працювати з великою кількістю незавершених з’єднаннь. | ||
Деякі архітектури серверів запускають один процес на одне з’єднання, в результаті чого процесів стає стільки, скільки є з’єднань, при цьому кожен процес споживає досить багато пам’яті. Таким чином, занадто багато з’єднань просто використають усю память. | ||
Це досить часто трапляється з серверами, які використовують мовиPHPі Ruby. | ||
Сервери, написані за допомогоюNode.js, зазвичай не мають таких проблем. | ||
Тим не менш, це не проблема мови програмування. Більшість сучасних мов, включаючи PHPі Ruby, дозволяють реалізувати належну роботу сервера. Просто переконайтеся, що архітектура вашого сервера добре працює з багатьма одночасними з’єднаннями. | ||
``` | ||
##Демо: чат | ||
Ось демонстраційний чат, який ви також можете завантажити та запустити локально (якщо ви знайомі з Node.jsі вмієте встановлювати модулі): | ||
[codetabs src="longpoll" height=500] | ||
Браузерний код знаходиться в `browser.js`. | ||
##Область використання | ||
Тривале опитування чудово працює в ситуаціях, коли повідомлення надходять рідко. | ||
Якщо повідомлення надходять дуже часто, то діаграма запиту-отримання повідомлень, намальована вище, стає схожою на пилку. | ||
Кожне повідомлення є окремим запитом із заголовками, накладними витратами на аутентифікацію тощо. | ||
У цьому випадку перевага віддається іншим методам, наприклад[Websocket](info:websocket)або [Server Sent Events](info:server-sent-events). |
16 changes: 8 additions & 8 deletions5-network/10-long-polling/longpoll.view/browser.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
6 changes: 3 additions & 3 deletions5-network/10-long-polling/longpoll.view/index.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,18 @@ | ||
<!DOCTYPE html> | ||
<script src="browser.js"></script> | ||
Усі відвідувачі цієї сторінки будуть бачити повідомлення один одного. | ||
<form name="publish"> | ||
<input type="text" name="message" /> | ||
<input type="submit" value="Надіслати" /> | ||
</form> | ||
<div id="subscribe"> | ||
</div> | ||
<script> | ||
new PublishForm(document.forms.publish, 'publish'); | ||
//випадковий параметр URL-адреси, щоб уникнути проблем із кешуванням | ||
new SubscribePane(document.getElementById('subscribe'), 'subscribe?random=' + Math.random()); | ||
</script> |
10 changes: 5 additions & 5 deletions5-network/10-long-polling/longpoll.view/server.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.