Long Polling vs. Short Polling: Porównanie
Long Polling
Zasada działania
Klient wysyła zapytanie do serwera, a serwer utrzymuje to połączenie otwarte do momentu, aż będzie miał nowe dane do wysłania. Po odebraniu odpowiedzi klient natychmiast wysyła kolejne zapytanie.
Zalety
- Niskie zużycie zasobów serwera:
Połączenie utrzymywane jest tylko do momentu, gdy są dostępne nowe dane, co zmniejsza liczbę niepotrzebnych zapytań. - Niższe opóźnienia w dostarczaniu danych:
Dane są dostarczane w momencie ich dostępności, co zapewnia prawie natychmiastową aktualizację. - Brak stałego połączenia:
Działa na tradycyjnym HTTP bez potrzeby stosowania protokołów takich jak WebSocket. - Prostsza implementacja w porównaniu z WebSocketami:
Można zaimplementować w środowiskach, które nie wspierają bardziej zaawansowanych technologii.
Wady
- Dłuższy czas oczekiwania:
Klient może czekać na odpowiedź nawet przez kilka sekund, co w niektórych przypadkach jest nieefektywne. - Ograniczenia skalowalności:
W dużych aplikacjach może powodować problemy z obciążeniem serwera ze względu na utrzymywanie dużej liczby połączeń jednocześnie. - Timeouty:
Długie oczekiwanie może wymagać dodatkowej obsługi timeoutów po stronie klienta i serwera.
Praktyczne zastosowania
- Aplikacje typu chat: Natychmiastowa aktualizacja wiadomości w rozmowie.
- Powiadomienia w czasie rzeczywistym: Alerty o zdarzeniach, np. zmiana statusu zamówienia.
- Systemy monitorowania: Śledzenie zdarzeń na bieżąco (np. zmiany stanu systemu).
Przykładowy kod
Kod po stronie klienta
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Long Polling Example</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<div id="messages"></div>
<script>
function startLongPolling() {
$.ajax({
url: "long_polling.php", // Ścieżka do skryptu PHP
method: "GET",
dataType: "json",
success: function(response) {
if (response.success) {
$("#messages").append(`<p>${response.message}</p>`);
}
// Kontynuuj polling
startLongPolling();
},
error: function() {
console.error("Błąd podczas pobierania danych.");
// Ponów próbę po krótkim czasie
setTimeout(startLongPolling, 5000);
}
});
}
// Rozpocznij long polling
startLongPolling();
</script>
</body>
</html>
Kod po stronie serwera
<?php
// Ustawienia
set_time_limit(30); // Maksymalny czas działania skryptu (30 sekund)
$startTime = time();
$timeout = 25; // Czas oczekiwania na nowe dane (25 sekund)
// Funkcja symulująca sprawdzanie nowych danych
function checkForNewData() {
// Przykład: Generowanie nowej wiadomości co kilka sekund
$shouldSendData = rand(0, 1); // Zwraca 1 lub 0 losowo
if ($shouldSendData) {
return "Nowa wiadomość: " . date('H:i:s');
}
return false;
}
header("Content-Type: application/json");
while (true) {
// Sprawdź nowe dane
$newData = checkForNewData();
if ($newData) {
echo json_encode([
"success" => true,
"message" => $newData
]);
exit;
}
// Przerwij pętlę, jeśli upłynął czas oczekiwania
if (time() - $startTime > $timeout) {
echo json_encode([
"success" => false,
"message" => "Brak nowych danych"
]);
exit;
}
// Krótka przerwa, aby zmniejszyć obciążenie serwera
usleep(500000); // 0.5 sekundy
}
Short Polling
Zasada działania
Klient cyklicznie wysyła zapytania do serwera w określonych odstępach czasu (np. co 1 sekundę), aby sprawdzić, czy są dostępne nowe dane.
Zalety
- Prostota implementacji:
Łatwe do zrozumienia i wdrożenia zarówno po stronie klienta, jak i serwera. - Niezależność od stanu połączenia:
Nie wymaga utrzymywania otwartego połączenia przez dłuższy czas. - Brak problemów z timeoutami:
Każde zapytanie jest niezależne, więc timeouty są mniej problematyczne.
Wady
- Zwiększone obciążenie serwera:
Duża liczba zapytań w krótkich odstępach czasu generuje znaczny ruch sieciowy i obciążenie serwera. - Większe zużycie zasobów klienta:
Klient musi cyklicznie inicjować nowe zapytania, co może zwiększyć zużycie energii i zasobów urządzenia. - Opóźnienia w aktualizacjach:
Nowe dane mogą być dostępne na serwerze tuż po zapytaniu klienta, ale zostaną odebrane dopiero przy następnym cyklicznym zapytaniu. - Marnowanie zasobów:
Nawet gdy brak nowych danych, klient wciąż wysyła zapytania, co jest nieefektywne.
Praktyczne zastosowania
- Synchronizacja danych w tle: Pobieranie zaktualizowanych danych w ustalonych interwałach, np. prognozy pogody.
- Statystyki i raporty: Aktualizacja metryk w systemach analitycznych.
- Proste systemy alertowe: Odpowiednie, gdy czas reakcji nie jest krytyczny.
Przykładowy kod
Kod po stronie klienta
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Short Polling</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>Short Polling z PHP</h1>
<div id="messages">
<h2>Otrzymane wiadomości:</h2>
<ul id="message-list"></ul>
</div>
<script>
// Funkcja do pobierania aktualizacji
function fetchUpdates() {
setInterval(() => {
$.ajax({
url: 'server.php',
method: 'GET',
success: function (response) {
const data = response;
const messageList = $('#message-list');
messageList.empty(); // Czyszczenie listy
data.forEach(item => {
messageList.append(`<li>${item.id}: ${item.message}</li>`);
});
},
error: function (xhr, status, error) {
console.error('Błąd podczas komunikacji z serwerem:', error);
}
});
}, 5000); // Czas w milisekundach
}
// Uruchomienie funkcji Short Polling
fetchUpdates();
</script>
</body>
</html>
Kod po stronie serwera
<?php
// Plik server.php
// Symulowana lista wiadomości
session_start();
if (!isset($_SESSION['messages'])) {
$_SESSION['messages'] = [
['id' => 1, 'message' => 'Pierwsza wiadomość'],
['id' => 2, 'message' => 'Druga wiadomość']
];
}
// Dodanie nowej wiadomości za każdym zapytaniem
$newMessage = [
'id' => count($_SESSION['messages']) + 1,
'message' => 'Wiadomość nr ' . (count($_SESSION['messages']) + 1)
];
$_SESSION['messages'][] = $newMessage;
// Zwrócenie danych w formacie JSON
header('Content-Type: application/json');
echo json_encode($_SESSION['messages']);
?>
Podsumowanie
Cechy | Long Polling | Short Polling |
---|---|---|
Efektywność | Bardziej efektywny przy rzadkich aktualizacjach | Mniej efektywny z powodu częstych zapytań |
Opóźnienia | Minimalne opóźnienia | Opóźnienia zależne od interwału |
Zasoby serwera | Większe obciążenie w przypadku wielu klientów | Stałe obciążenie niezależne od dostępności danych |
Implementacja | Nieco bardziej skomplikowana | Prosta w implementacji |
Wybór metody
- Long Polling sprawdza się, gdy potrzebne są natychmiastowe aktualizacje (np. chat, powiadomienia).
- Short Polling jest odpowiednie, gdy nowe dane są generowane w przewidywalnych odstępach czasu, a opóźnienia nie są krytyczne.
21 stycznia 2025
11