Sobes.tech
Middle+

Πώς να υλοποιήσετε το μοτίβο Waiter για το API;

sobes.tech AI

Απάντηση από AI

Το μοτίβο Waiter για το API υλοποιείται με την αποστολή περιοδικών αιτημάτων στην υπηρεσία μέχρι να εκπληρωθεί μια συγκεκριμένη συνθήκη ή να λήξει ο χρόνος αναμονής.

Βασικά συστατικά:

  1. Αίτημα στόχος (Target Request): Το αίτημα που εκτελείται και το αποτέλεσμα του οποίου ελέγχεται.
  2. Όρος ολοκλήρωσης (Completion Condition): Λογική έκφραση που καθορίζει πότε πρέπει να τερματίσει η αναμονή. Αυτό μπορεί να είναι μια συγκεκριμένη κατάσταση απάντησης (π.χ., 200 OK), μια τιμή στο σώμα της απάντησης, η παρουσία ή απουσία πόρου κ.λπ.
  3. Διάστημα ελέγχου (Polling Interval): Χρόνος μεταξύ διαδοχικών αιτημάτων.
  4. Χρόνος λήξης (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 είναι χρήσιμο για την αναμονή ολοκλήρωσης ασύγχρονων λειτουργιών, τη διαθεσιμότητα της υπηρεσίας μετά από ανάπτυξη ή την εμφάνιση δεδομένων που παράγονται από άλλες διαδικασίες.