Fork me on GitHub

Επιτηρητές OTP

Οι Επιτηρητές είναι εξειδικευμένες διεργασίες με ένα σκοπό: την επισκόπηση άλλων διεργασιών. Αυτοί οι επιτηρητές μας επιτρέπουν να δημιουργούμε ανεκτικές στα σφάλματα εφαρμογές με το να επανεκινούν τις διεργασίες παιδιά όταν αποτυγχάνουν.

Πίνακας περιεχομένων

Ρύθμιση

Η μαγεία των Επιτηρητών είναι στη συνάρτηση Supervisor.start_link/2. Επιπρόσθετα με την εκκίνηση του επιτηρητή και των παιδιών, μας επιτρέπει να ορίσουμε τη στρατηγική που χρησιμοποιεί ο επιτηρητής για τη διαχείριση των διεργασιών παιδιών.

Οι διεργασίες παιδιά ορίζονται με τη χρήση μιας λίστας και της συνάρτησης worker/3 που εισάγουμε από την ενότητα Supervisor.Spec. Η συνάρτηση worker/3 δέχεται μια ενότητα, ορίσματα, και ένα σύνολο επιλογών. Υπόγεια, η worker/3 καλεί τη start_link/3 με τα ορίσματά μας κατά την αρχικοποίηση.

Ας αρχίσουμε χρησιμοποιώντας την ενότητα SimpleQueue από το μάθημα Συγχρονισμός OTP:

import Supervisor.Spec

children = [
  worker(SimpleQueue, [], [name: SimpleQueue])
]

{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)

Αν οι διεργασίες μας κρασάρουν ή τερματιστούν, ο επιτηρητής μας θα την επανεκκινήσει αυτόματα σαν να μη συνέβη τίποτα.

Στρατηγικές

Αυτή τη στιγμή οι επιτηρητές μας έχουν διαθέσιμες τέσσερις διαφορετικές στρατηγικές επανεκκίνησης:

Ενσωμάτωση

Επιπρόσθετα στις διεργασίες εργάτες, μπορούμε να επιτηρήσουμε επιτηρητές για να δημιουργήσουμε ένα δέντρο επιτήρησης. Η μόνη διαφορά σε εμάς είναι η εναλλαγή της supervisor/3 με την worker/3:

import Supervisor.Spec

children = [
  supervisor(ExampleApp.ConnectionSupervisor, [[name: ExampleApp.ConnectionSupervisor]]),
  worker(SimpleQueue, [[], [name: SimpleQueue]])
]

{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)

Επιτηρητής Εργασίας

Οι εργασίες έχουν το δικό τους εξειδικευμένο Επιτηρητή, τον Task.Supervisor. Σχεδιασμένος για δυναμικά δημιουργημένες εργασίες, ο επιτηρητής χρησιμοποιεί την :simple_one_for_one.

Εγκατάσταση

Η συμπερίληψη του Task.Supervisor δεν έχει καμμία διαφορά από τους άλλους επιτηρητές:

import Supervisor.Spec

children = [
  supervisor(Task.Supervisor, [[name: ExampleApp.TaskSupervisor]]),
]

{:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)

Επιτηρούμενες Εργασίες

Με τον επιτηρητή να έχει ξεκινήσει, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση start_child/2 για να δημιουργήσουμε μια επιτηρούμενη εργασία:

{:ok, pid} = Task.Supervisor.start_child(ExampleApp.TaskSupervisor, fn -> background_work end)

Αν η εργασία μας κρασάρει πρόωρα θα επανεκκινηθεί. Αυτό μπορεί να αποδειχθεί ιδιαίτερα χρήσιμο όταν δουλεύουμε με εισερχόμενες συνδέσεις ή επεξεργαζόμαστε δεδομένα στο παρασκήνιο.


Share This Page