Middle+
Πώς να υλοποιήσετε το μοτίβο Waiter για το API;
sobes.tech AI
Απάντηση από AI
Το μοτίβο Waiter για το API υλοποιείται με την αποστολή περιοδικών αιτημάτων στην υπηρεσία μέχρι να εκπληρωθεί μια συγκεκριμένη συνθήκη ή να λήξει ο χρόνος αναμονής.
Βασικά συστατικά:
- Αίτημα στόχος (Target Request): Το αίτημα που εκτελείται και το αποτέλεσμα του οποίου ελέγχεται.
- Όρος ολοκλήρωσης (Completion Condition): Λογική έκφραση που καθορίζει πότε πρέπει να τερματίσει η αναμονή. Αυτό μπορεί να είναι μια συγκεκριμένη κατάσταση απάντησης (π.χ., 200 OK), μια τιμή στο σώμα της απάντησης, η παρουσία ή απουσία πόρου κ.λπ.
- Διάστημα ελέγχου (Polling Interval): Χρόνος μεταξύ διαδοχικών αιτημάτων.
- Χρόνος λήξης (Timeout): Μέγιστος χρόνος κατά τον οποίο ο Waiter θα εκτελεί αιτήματα προτού τερματίσει με σφάλμα.
Παράδειγμα υλοποίησης σε Python με τη χρήση της βιβλιοθήκης requests:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Υλοποίηση του μοτίβου Waiter για το API.
Args:
url (str): Η διεύθυνση URL του πόρου που περιμένουμε.
expected_status (int): Ο αναμενόμενος κωδικός κατάστασης HTTP.
interval (int): Το διάστημα μεταξύ των αιτημάτων σε δευτερόλεπτα.
timeout (int): Ο μέγιστος χρόνος αναμονής σε δευτερόλεπτα.
Raises:
TimeoutError: Αν λήξει ο χρόνος αναμονής πριν από την επίτευξη της αναμενόμενης κατάστασης.
Exception: Αν προκύψει σφάλμα κατά την εκτέλεση του αιτήματος.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"Ο πόρος στη διεύθυνση {url} είναι διαθέσιμος με την αναμενόμενη κατάσταση {expected_status}.")
return response
else:
print(f"Ο πόρος στη διεύθυνση {url} δεν είναι διαθέσιμος. Τρέχουσα κατάσταση: {response.status_code}. Αναμονή...")
except requests.exceptions.RequestException as e:
print(f"Σφάλμα κατά το αίτημα προς {url}: {e}. Αναμονή...")
time.sleep(interval)
raise TimeoutError(f"Ο χρόνος αναμονής για τον πόρο {url} έχει λήξει.")
# Παράδειγμα χρήσης
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Σφάλμα στον Waiter: {e}")
Εναλλακτικές υλοποιήσεις:
- Αναμονή βάσει του σώματος της απάντησης: Έλεγχος συγκεκριμένης τιμής ή δομής στο σώμα της απάντησης JSON/XML.
- Εκθετική επιστροφή (Backoff): Αύξηση του διαστήματος αναμονής μεταξύ προσπαθειών για μείωση του φορτίου στην υπηρεσία σε συχνές χρονικές υπερβάσεις.
- Παραμετροποιημένος Waiter: Δυνατότητα μεταβίβασης παραμέτρων στο στόχο αίτημα.
- Προσαρμοσμένος Waiter: Χρήση πιο σύνθετων συνθηκών, π.χ., συνδυασμός κατάστασης και περιεχομένου απάντησης.
Το μοτίβο Waiter είναι χρήσιμο για την αναμονή ολοκλήρωσης ασύγχρονων λειτουργιών, τη διαθεσιμότητα της υπηρεσίας μετά από ανάπτυξη ή την εμφάνιση δεδομένων που παράγονται από άλλες διαδικασίες.