Skip to content

Commit

Permalink
Update gen-stage.md (elixirschool#872)
Browse files Browse the repository at this point in the history
* Update gen-stage.md

* Update the translation for the word 'sink'
  • Loading branch information
gemantzu authored and doomspork committed Dec 14, 2016
1 parent d1555e7 commit 6e1c116
Showing 1 changed file with 14 additions and 14 deletions.
28 changes: 14 additions & 14 deletions gr/lessons/advanced/gen-stage.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ lang: gr

Τι είναι το GenStage; Από την επίσημη τεκμηρίωση, είναι "ένας προσδιοριμός και μια επεξεργαστική ροή για την Elixir", αλλά τι σημαίνει αυτό για εμάς;

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

Για να κατανοήσετε καλύτερα πως δουλεύει, ας σκεφτούμε μια απλή ροή παραγωγού-καταναλωτή:

Expand All @@ -24,29 +24,29 @@ lang: gr

Σε αυτό το παράδειγμα έχουμε τρία στάδια: το `A` είναι ένας παραγωγός, το `B` είναι ένας παραγωγός-καταναλωτής και το `C` είναι ένας καταναλωτής. το `A` παράγει μια τιμή η οποία καταναλώνεται από το `B`, το `B` κάνει κάποια εργασία και επιστρέφει μια νέα τιμή η οποία λαμβάνεται από τον καταναλωτή μας `C`. Ο ρόλος του σταδίου μας είναι σημαντικός, όπως θα δούμε στον επόμενο τομέα.

Παρόλο που το παράδειγμά μας είανι 1-προς-1 παραγωγός-προς-καταναλωτή, είναι δυνατό να έχουμε πολλαπλούς παραγωγούς και πολλαπλούς καταναλωτές σε οποιοδήποτε στάδιο.
Παρόλο που το παράδειγμά μας είναι 1-προς-1 παραγωγός-προς-καταναλωτή, είναι δυνατό να έχουμε πολλαπλούς παραγωγούς και πολλαπλούς καταναλωτές σε οποιοδήποτε στάδιο.

Για να παρουσιάσουμε καλύτερα αυτές τις έννοιες θα κατασκευάσουμε έναν αγωγό με το GenStage, αλλά πρώτα ας εξερευνήσουμε περισσότερο τους ρόλους στους οποίος βασίζεται το GenStage.

## Καταναλωτές και Παραγωγοί

Όπως έχουμε διαβάσει, ο ρόλος που δίνουμε στο στάδιό μας είναι σημαντικός. Οι προδιαγραφές του GenStage αναγνωρίζουν τρεις ρόλους:

+ `:producer` β€” Μια πηγή. Οι παραγωγοί περιμένουν για ζήτηση από τους καταναλωτές και ανταποκρίνονται με τα συμβάντα που ζητήθηκαν.
+ `:producer` Μια πηγή. Οι παραγωγοί περιμένουν για ζήτηση από τους καταναλωτές και ανταποκρίνονται με τα συμβάντα που ζητήθηκαν.

+ `:producer_consumer` β€” Ταυτόχρονα μια πηγή και ένας νεροχύτης. Οι παραγωγοί-καταναλωτές μπορούν να ανταποκριθούν στη ζήτηση από άλλους καταναλωτές και να ζητήσουν συμβάντα από παραγωγούς.
+ `:producer_consumer` Ταυτόχρονα μια πηγή και ένας προορισμός. Οι παραγωγοί-καταναλωτές μπορούν να ανταποκριθούν στη ζήτηση από άλλους καταναλωτές και να ζητήσουν συμβάντα από παραγωγούς.

+ `:consumer` β€” Ένας νεροχύτης. Ένας καταναλωτής ζητάει και λαμβάνει δεδομένα από παραγωγούς.
+ `:consumer` Ένας προορισμός. Ένας καταναλωτής ζητάει και λαμβάνει δεδομένα από παραγωγούς.

Παρατηρήτε ότι οι παραγωγοί μας _περιμένουν_ για ζήτηση; Με το GenStage οι καταναλωτές στέλνουν αιτήσεις προς τα πάνω και επεξεργάζονται τα δεδομένα από τον παραγωγό. Αυτό διευκολύνει ένα μηχανισμό γνωστό ως αντίθλιψη. Η αντίθλιψη βάζει το βάρος στον παραγωγό ώστε να μην πιέζει υπερβολίκα όταν οι καταναλωτές είναι απασχολημένοι.
Παρατηρείτε ότι οι παραγωγοί μας _περιμένουν_ για ζήτηση; Με το GenStage οι καταναλωτές στέλνουν αιτήσεις προς τα πάνω και επεξεργάζονται τα δεδομένα από τον παραγωγό. Αυτό διευκολύνει ένα μηχανισμό γνωστό ως αντίθλιψη. Η αντίθλιψη βάζει το βάρος στον παραγωγό ώστε να μην πιέζει υπερβολικά όταν οι καταναλωτές είναι απασχολημένοι.

Τώρα που καλύψαμε τους ρόλους στο GenStage, ας ξεκινήσουμε με την εφαρμογή μας.

## Ξεκινώντας

Σε αυτό το παράδειγμα θα κατασκευάσουμε μια εφαρμογή GenStage που στέλνει αριθμούς, ταξινομεί τους ζυγούς και τέλος τους τυπώνει.

Για την εφαρμογή μας θα χρησιμοποιήσουμε και τους τρεις ρόλους GenStage. Ο παραγωγός μας θα είναι υπέυθυνος για το μέτρημα και την αποστολή των αριθμών. Θα χρησιμοποιήσουμε ένα παραγωγό-καταναλωτή για να φιλτράρουμε τους ζυγούς αριθμούς και αργότερα να ανταποκρινόμαστε στη ζήτηση από κάτω. Τέλος θα χτίσουμε ένα καταναλωτή για να εμφανίσουμε τους εναπομείναντες αριθμούς.
Για την εφαρμογή μας θα χρησιμοποιήσουμε και τους τρεις ρόλους GenStage. Ο παραγωγός μας θα είναι υπεύθυνος για το μέτρημα και την αποστολή των αριθμών. Θα χρησιμοποιήσουμε ένα παραγωγό-καταναλωτή για να φιλτράρουμε τους ζυγούς αριθμούς και αργότερα να ανταποκρινόμαστε στη ζήτηση από κάτω. Τέλος θα χτίσουμε ένα καταναλωτή για να εμφανίσουμε τους εναπομείναντες αριθμούς.

Θα ξεκινήσουμε δημιουργώντας ένα project με ένα δέντρο παρακολούθησης:

Expand Down Expand Up @@ -75,7 +75,7 @@ $ mix do deps.get, compile

## Παραγωγός

Το πρώτο βήμα της εφαρμογής GenStage μας είναι να δημιουργήσουμε τον παραγωγό μας. Όπως συζητήσαμε πριν θέλουμε να δημιουργήσουμε ένα παραγωγό που στέλνει μια συνεχής ροή αριθμών. Ας δημιουργήσουμε το αρχείο παραγωγού:
Το πρώτο βήμα της εφαρμογής GenStage μας είναι να δημιουργήσουμε τον παραγωγό μας. Όπως συζητήσαμε πριν θέλουμε να δημιουργήσουμε ένα παραγωγό που στέλνει μια συνεχή ροή αριθμών. Ας δημιουργήσουμε το αρχείο παραγωγού:

```shell
$ mkdir lib/genstage_example
Expand Down Expand Up @@ -103,9 +103,9 @@ defmodule GenstageExample.Producer do
end
```

Τα δύο πιο σημαντικά μέρη που πρέπει να σημειώσουμε εδώ είναι οι `init/1` και `handle_demand/2`. Στην `init/1` ορίζουμε την αρχική κατάσταση όπως θα κάναμε στους GenServers μας αλλά το πιο σημαντικό είναι ότι μας βάζουμε την ταμπέλα του παραγωγού. Η απάντηση της συνάρτησης μας `init/1` είναι αυτή στην οποία στηρίζεται το GenStage για να ταξινομήσει την διεργασία μας.
Τα δύο πιο σημαντικά μέρη που πρέπει να σημειώσουμε εδώ είναι οι `init/1` και `handle_demand/2`. Στην `init/1` ορίζουμε την αρχική κατάσταση όπως θα κάναμε στους GenServers μας αλλά το πιο σημαντικό είναι ότι μας βάζουμε την ταμπέλα του παραγωγού. Η απάντηση της συνάρτησής μας `init/1` είναι αυτή στην οποία στηρίζεται το GenStage για να ταξινομήσει την διεργασία μας.

Η συνάρτηση `handle_demand/2` είναι εκεί που βρίσκεται η πλειοψηφία των παραγωγών μας και πρέπει να υλοποιηθεί από όλους τους GenStage παραγωγούς. Εδώ επιστρέφουμε το σετ των αριθμών που ζητούντε από τους καταναλωτές μας και αυξάνουμε το μετρητή μας. Η ζήτηση από τους καταναλωτές, η μεταβλητή `demand` στον κώδικα από πάνω, είναι ένας ακέραιος που αναπαριστά τον αριθμό των συμβάντων που μπορούν να χειριστούν, με προκαθορισμένο το 1000.
Η συνάρτηση `handle_demand/2` είναι εκεί που βρίσκεται η πλειοψηφία των παραγωγών μας και πρέπει να υλοποιηθεί από όλους τους GenStage παραγωγούς. Εδώ επιστρέφουμε το σετ των αριθμών που ζητούνται από τους καταναλωτές μας και αυξάνουμε το μετρητή μας. Η ζήτηση από τους καταναλωτές, η μεταβλητή `demand` στον κώδικα από πάνω, είναι ένας ακέραιος που αναπαριστά τον αριθμό των συμβάντων που μπορούν να χειριστούν, με προκαθορισμένο το 1000.

## Παραγωγός Καταναλωτής

Expand Down Expand Up @@ -154,7 +154,7 @@ end
$ touch lib/genstage_example/consumer.ex
```

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

```elixir
defmodule GenstageExample.Consumer do
Expand Down Expand Up @@ -252,10 +252,10 @@ $ mix run --no-halt

Τώρα που καλύψαμε το GenStage και χτίσαμε το πρώτη μας δοκιμαστική εφαρμογή, ποιές είναι μερικές από τις _πραγματικές_ περιπτώσεις χρήσης για το GenStage;

+ Σωλήνας Μετατροπής Δεδομένων β€” Οι παραγωγοί δεν χρειάζεται να είναι απλές γεννήτριες αριθμών, θα μπορούσαμε να παράγουμε συμβάντα από μια βάση δεδομένων ή ακόμα από μια άλλη πηγή όπως η Apache Kafka. Με ένα συνδυασμό παραγωγών-καταναλωτών και καταναλωτών θα μπορούσαμε να παράγουμε, ταξινομήσουμε, καταγράψουμε και αποθηκεύσουμε μετρήσεις καθώς γίνονται διαθέσιμες.
+ Σωλήνας Μετατροπής Δεδομένων Οι παραγωγοί δεν χρειάζεται να είναι απλές γεννήτριες αριθμών, θα μπορούσαμε να παράγουμε συμβάντα από μια βάση δεδομένων ή ακόμα από μια άλλη πηγή όπως η Apache Kafka. Με ένα συνδυασμό παραγωγών-καταναλωτών και καταναλωτών θα μπορούσαμε να παράγουμε, ταξινομήσουμε, καταγράψουμε και αποθηκεύσουμε μετρήσεις καθώς γίνονται διαθέσιμες.

+ Ουρά Εργασίας β€” Αφού τα συμβάντα μπορούν να είναι οτιδήποτε θα μπορούσαμε να παράγουμε εργασίες μονάδων για να ολοκληρωθούν από μια σειρά καταναλωτών.
+ Ουρά Εργασίας Αφού τα συμβάντα μπορούν να είναι οτιδήποτε θα μπορούσαμε να παράγουμε εργασίες μονάδων για να ολοκληρωθούν από μια σειρά καταναλωτών.

+ Επεξεργασία Συμβάντων β€” Παρόμοια στο σωλήνα δεδομένων θα μπορούσαμε να λαμβάνουμε, επεξεργαζόμαστε, ταξινομούμε και να δρούμε πάνω σε συμβάντα που στέλντονται σε πραγματικό χρόνο από τις πηγές μας.
+ Επεξεργασία Συμβάντων Παρόμοια στο σωλήνα δεδομένων θα μπορούσαμε να λαμβάνουμε, επεξεργαζόμαστε, ταξινομούμε και να δρούμε πάνω σε συμβάντα που στέλντονται σε πραγματικό χρόνο από τις πηγές μας.

Αυτές είναι μόλιες _μερικές_ από τις πιθανότητες για το GenStage.

0 comments on commit 6e1c116

Please sign in to comment.