Εξόρυξη δεδομένων για Προγνωστική ανάλυση κοινωνικών δικτύων
Επιστήμη Δεδομένων Και Βάσεις Δεδομένων
Η αρχιτεκτονική Microservice είναι μια πολύ δημοφιλής προσέγγιση στο σχεδιασμό και την εφαρμογή πολύ επεκτάσιμων εφαρμογών Ιστού. Η επικοινωνία σε μια μονολιθική εφαρμογή μεταξύ των στοιχείων βασίζεται συνήθως σε μεθόδους ή σε κλήσεις λειτουργιών στην ίδια διαδικασία. Μια εφαρμογή που βασίζεται σε μικροσυσκευές, από την άλλη πλευρά, είναι ένα κατανεμημένο σύστημα που λειτουργεί σε πολλά μηχανήματα.
Η επικοινωνία μεταξύ αυτών των μικροϋπηρεσιών είναι σημαντική προκειμένου να υπάρχει ένα σταθερό και επεκτάσιμο σύστημα. Υπάρχουν πολλοί τρόποι για να το κάνετε αυτό. Η επικοινωνία βάσει μηνύματος είναι ένας τρόπος να το κάνετε αξιόπιστα.
Όταν χρησιμοποιείτε ανταλλαγή μηνυμάτων, τα στοιχεία αλληλεπιδρούν μεταξύ τους ανταλλάσσοντας ασύγχρονα μηνύματα. Τα μηνύματα ανταλλάσσονται μέσω καναλιών.
Όταν η Υπηρεσία Α θέλει να επικοινωνήσει με την Υπηρεσία Β, αντί να την στείλει απευθείας, η Α την στέλνει σε ένα συγκεκριμένο κανάλι. Όταν η Υπηρεσία Β θέλει να διαβάσει το μήνυμα, παραλαμβάνει το μήνυμα από ένα συγκεκριμένο κανάλι μηνυμάτων.
Σε αυτό το σεμινάριο Spring Integration, θα μάθετε πώς να εφαρμόζετε μηνύματα σε μια εφαρμογή Spring χρησιμοποιώντας το Redis. Θα ακολουθήσετε ένα παράδειγμα εφαρμογής όπου μία υπηρεσία προωθεί συμβάντα στην ουρά και μια άλλη υπηρεσία επεξεργάζεται αυτά τα συμβάντα ένα προς ένα.
Το έργο Spring Integration επεκτείνει το πλαίσιο Spring για να παρέχει υποστήριξη για ανταλλαγή μηνυμάτων μεταξύ ή εντός εφαρμογών που βασίζονται στην άνοιξη. Τα στοιχεία συνδέονται μεταξύ τους μέσω του παραδείγματος ανταλλαγής μηνυμάτων. Τα μεμονωμένα στοιχεία ενδέχεται να μην γνωρίζουν άλλα στοιχεία της εφαρμογής.
Το Spring Integration παρέχει μια ευρεία επιλογή μηχανισμών για επικοινωνία με εξωτερικά συστήματα. Οι προσαρμογείς καναλιών είναι ένας τέτοιος μηχανισμός που χρησιμοποιείται για μονόδρομη ολοκλήρωση (αποστολή ή λήψη). Και οι πύλες χρησιμοποιούνται για σενάρια αιτήσεων / απαντήσεων (εισερχόμενα ή εξερχόμενα).
Το Apache Camel είναι μια εναλλακτική λύση που χρησιμοποιείται ευρέως. Η ανοιξιάτικη ολοκλήρωση προτιμάται συνήθως στις υπάρχουσες υπηρεσίες που βασίζονται στην άνοιξη, καθώς αποτελεί μέρος του εαρινού οικοσυστήματος.
Το Redis είναι ένα εξαιρετικά γρήγορο κατάστημα δεδομένων στη μνήμη. Προαιρετικά μπορεί να παραμείνει και σε δίσκο. Υποστηρίζει διαφορετικές δομές δεδομένων όπως απλά ζεύγη κλειδιών-τιμών, σύνολα, ουρές κ.λπ.
tdd και bdd σε ευκίνητο
Η χρήση του Redis ως ουράς καθιστά την κοινή χρήση δεδομένων μεταξύ στοιχείων και οριζόντιας κλιμάκωσης πολύ πιο εύκολη. Ένας παραγωγός ή πολλοί παραγωγοί μπορούν να ωθήσουν τα δεδομένα στην ουρά και ένας καταναλωτής ή πολλοί καταναλωτές μπορούν να τραβήξουν τα δεδομένα και να επεξεργαστούν το συμβάν.
Πολλοί καταναλωτές δεν μπορούν να καταναλώσουν το ίδιο συμβάν - αυτό διασφαλίζει την επεξεργασία ενός συμβάντος μία φορά.
Οφέλη από τη χρήση του Redis ως ουρά μηνυμάτων:
Κανόνες:
Τα παρακάτω περιγράφουν τη δημιουργία ενός δείγματος εφαρμογής για να εξηγήσουν πώς να χρησιμοποιήσετε το Spring Integration με το Redis.
Ας υποθέσουμε ότι έχετε μια εφαρμογή που επιτρέπει στους χρήστες να δημοσιεύουν αναρτήσεις. Και θέλετε να δημιουργήσετε μια δυνατότητα παρακολούθησης. Μια άλλη απαίτηση είναι ότι κάθε φορά που κάποιος δημοσιεύει μια ανάρτηση, όλοι οι ακόλουθοι θα πρέπει να ενημερώνονται μέσω κάποιου καναλιού επικοινωνίας (π.χ. ειδοποίηση μέσω email ή push).
Ένας τρόπος για να το εφαρμόσετε είναι να στείλετε ένα email σε κάθε ακόλουθο όταν ο χρήστης δημοσιεύσει κάτι. Τι συμβαίνει όμως όταν ο χρήστης έχει 1.000 ακόλουθους; Και όταν 1.000 χρήστες δημοσιεύουν κάτι σε 10 δευτερόλεπτα, καθένας από τους οποίους έχει 1.000 ακόλουθους; Επίσης, θα περιμένει η ανάρτηση του εκδότη έως ότου αποσταλούν όλα τα μηνύματα ηλεκτρονικού ταχυδρομείου;
Τα κατανεμημένα συστήματα επιλύουν αυτό το πρόβλημα.
ποιοι είναι οι διαφορετικοί τύποι llc
Αυτό το συγκεκριμένο πρόβλημα θα μπορούσε να επιλυθεί χρησιμοποιώντας μια ουρά. Η υπηρεσία Α (ο παραγωγός), η οποία είναι υπεύθυνη για τη δημοσίευση δημοσιεύσεων, θα το κάνει ακριβώς. Θα δημοσιεύσει μια ανάρτηση και θα προωθήσει ένα συμβάν με τη λίστα των χρηστών που πρέπει να λάβουν ένα email και την ίδια την ανάρτηση. Η λίστα χρηστών θα μπορούσε να ανακτηθεί στην υπηρεσία B, αλλά για απλότητα αυτού του παραδείγματος, θα την στείλουμε από την υπηρεσία A.
Αυτή είναι μια ασύγχρονη λειτουργία. Αυτό σημαίνει ότι η υπηρεσία που δημοσιεύει δεν θα πρέπει να περιμένει να στείλει email.
Η υπηρεσία B (ο καταναλωτής) θα τραβήξει το συμβάν από την ουρά και θα το επεξεργαστεί. Με αυτόν τον τρόπο, θα μπορούσαμε εύκολα να κλιμακώσουμε τις υπηρεσίες μας και θα μπορούσαμε να έχουμε n
καταναλωτές που στέλνουν email (επεξεργασία συμβάντων).
Ας ξεκινήσουμε λοιπόν με μια εφαρμογή στην υπηρεσία του παραγωγού. Οι απαραίτητες εξαρτήσεις είναι:
redis.clients jedis org.springframework.data spring-data-redis org.springframework.integration spring-integration-redis
Αυτές οι τρεις εξαρτήσεις Maven είναι απαραίτητες:
Στη συνέχεια, πρέπει να ρυθμίσουμε τον πελάτη Jedis:
@Configuration public class RedisConfig { @Value('${redis.host}') private String redisHost; @Value('${redis.port:6379}') private int redisPort; @Bean public JedisPoolConfig poolConfig() { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(128); return poolConfig; } @Bean public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig poolConfig) { final JedisConnectionFactory connectionFactory = new JedisConnectionFactory(); connectionFactory.setHostName(redisHost); connectionFactory.setPort(redisPort); connectionFactory.setPoolConfig(poolConfig); connectionFactory.setUsePool(true); return connectionFactory; } }
Ο σχολιασμός @Value
σημαίνει ότι το Spring θα εισαγάγει την τιμή που ορίζεται στις ιδιότητες εφαρμογής στο πεδίο. Αυτό σημαίνει redis.host
και redis.port
Οι τιμές πρέπει να καθοριστούν στις ιδιότητες της εφαρμογής.
Τώρα, πρέπει να καθορίσουμε το μήνυμα που θέλουμε να στείλουμε στην ουρά. Ένα απλό παράδειγμα μηνύματος θα μπορούσε να μοιάζει με:
@Getter @Setter @Builder public class PostPublishedEvent { private String postUrl; private String postTitle; private List emails; }
Σημείωση: Project Lombok ( https://projectlombok.org/ ) παρέχει το @Getter
, @Setter
, @Builder
, και πολλούς άλλους σχολιασμούς για να αποφευχθεί η ακαταστασία του κώδικα με τους λήπτες, τους ρυθμιστές και άλλα ασήμαντα πράγματα. Μπορείτε να μάθετε περισσότερα για αυτό αυτό το άρθρο ApeeScape .
Προγραμματισμός c++ για αρχάριους
Το ίδιο το μήνυμα θα αποθηκευτεί σε μορφή JSON στην ουρά. Κάθε φορά που ένα συμβάν δημοσιεύεται στην ουρά, το μήνυμα θα σειριοποιείται στο JSON. Και όταν καταναλώνετε από την ουρά, το μήνυμα θα αποστειρωθεί.
Με το μήνυμα που ορίζεται, πρέπει να ορίσουμε την ίδια την ουρά. Στην Άνοιξη της Ενσωμάτωσης, μπορεί να γίνει εύκολα μέσω ενός .xml
διαμόρφωση. Η διαμόρφωση πρέπει να τοποθετηθεί μέσα στο resources/WEB-INF
Ευρετήριο.
MessageChannel
Στη διαμόρφωση, μπορείτε να δείτε το μέρος 'int-redis: queue-outbound-channel-adapter.' Οι ιδιότητές του είναι:
RedisConnectionFactory
από το οποίο αυτό το τελικό σημείο λαμβάνει μηνύματα.#root
φασόλι.RedisSerializer
μεταβλητός. Αυτό το χαρακτηριστικό είναι αμοιβαία αποκλειστικό με την ουρά.JdkSerializationRedisSerializer
αναφορά φασολιών. Από προεπιλογή, είναι ένα String
. Ωστόσο, για StringRedisSerializer
ωφέλιμα φορτία, a true
χρησιμοποιείται εάν δεν παρέχεται αναφορά σειριοποίησης.true
.false
) ή το δεξί πάτημα (πότε false
) για να γράφει μηνύματα στη λίστα Redis. Εάν ισχύει, η λίστα Redis λειτουργεί ως ουρά FIFO όταν χρησιμοποιείται με έναν προεπιλεγμένο προσαρμογέα εισερχόμενου καναλιού ουράς Redis. Ορίστε σε true
για χρήση με λογισμικό που διαβάζει από τη λίστα με το αριστερό ποπ ή για να επιτύχετε μια σειρά μηνυμάτων που μοιάζουν με στοίβα. Η προεπιλεγμένη τιμή του είναι .xml
.Το επόμενο βήμα είναι να ορίσετε την πύλη, η οποία αναφέρεται στο RedisChannelGateway
διαμόρφωση. Για μια πύλη, χρησιμοποιούμε το org.toptal.queue
τάξη από το StringRedisSerializer
πακέτο.
.xml
χρησιμοποιείται για σειριοποίηση μηνυμάτων πριν από την αποθήκευση στο Redis. Επίσης στο RedisChannelGateway
διαμόρφωση, ορίσαμε την πύλη και ορίσαμε RedisChannelGateway
ως υπηρεσία πύλης. Αυτό σημαίνει ότι το default-request-channel
φασόλι θα μπορούσε να ενίεται σε άλλα φασόλια. Ορίσαμε την ιδιότητα @Gateway
επειδή είναι επίσης δυνατό να παρέχετε αναφορές καναλιών ανά μέθοδο χρησιμοποιώντας το public interface RedisChannelGateway { void enqueue(PostPublishedEvent event); }
σχόλιο. Ορισμός τάξης:
c++ περιλαμβάνει αρχείο
SpringIntegrationConfig
Για να συνδέσουμε αυτήν τη διαμόρφωση στην εφαρμογή μας, πρέπει να την εισαγάγουμε. Αυτό εφαρμόζεται στο @ImportResource('classpath:WEB-INF/event-queue-config.xml') @AutoConfigureAfter(RedisConfig.class) @Configuration public class SpringIntegrationConfig { }
τάξη.
@ImportResource
.xml
Ο σχολιασμός χρησιμοποιείται για την εισαγωγή Άνοιξη @Configuration
αρχεία διαμόρφωσης σε @AutoConfigureAfter
. Και enqueue
Ο σχολιασμός χρησιμοποιείται για να υπονοήσει ότι μια αυτόματη διαμόρφωση πρέπει να εφαρμοστεί μετά από άλλες καθορισμένες τάξεις αυτόματης διαμόρφωσης.
Τώρα θα δημιουργήσουμε μια υπηρεσία και θα εφαρμόσουμε τη μέθοδο που θα public interface QueueService { void enqueue(PostPublishedEvent event); }
εκδηλώσεις στην ουρά Redis.
@Service public class RedisQueueService implements QueueService { private RedisChannelGateway channelGateway; @Autowired public RedisQueueService(RedisChannelGateway channelGateway) { this.channelGateway = channelGateway; } @Override public void enqueue(PostPublishedEvent event) { channelGateway.enqueue(event); } }
enqueue
Και τώρα, μπορείτε εύκολα να στείλετε ένα μήνυμα στην ουρά χρησιμοποιώντας το QueueService
μέθοδος από LPUSH
.
Οι ουρές Redis είναι απλώς λίστες με έναν ή περισσότερους παραγωγούς και καταναλωτές. Για να δημοσιεύσουν ένα μήνυμα σε μια ουρά, οι παραγωγοί χρησιμοποιούν το redis-cli monitor
Επανάληψη εντολής. Και εάν παρακολουθείτε το Redis (υπόδειξη: type 'LPUSH' 'my-event-queue' '{'postUrl':'test','postTitle':'test','emails':['test']}'
), μπορείτε να δείτε ότι το μήνυμα προστίθεται στην ουρά:
PostPublishedEvent
Τώρα, πρέπει να δημιουργήσουμε μια εφαρμογή για καταναλωτές που θα τραβήξει αυτά τα συμβάντα από την ουρά και θα τα επεξεργαστεί. Η υπηρεσία καταναλωτών χρειάζεται τις ίδιες εξαρτήσεις με την υπηρεσία παραγωγών.
Τώρα μπορούμε να επαναχρησιμοποιήσουμε το resources/WEB-INF
τάξη για να αποστειρώσετε τα μηνύματα.
Πρέπει να δημιουργήσουμε τη διαμόρφωση ουράς και, πάλι, πρέπει να τοποθετηθεί μέσα στο .xml
Ευρετήριο. Το περιεχόμενο της διαμόρφωσης ουράς είναι:
int-redis:queue-inbound-channel-adapter
Στο MessageChannel
διαμόρφωση, SmartLifecycle
μπορεί να έχει τις ακόλουθες ιδιότητες:
true
στο οποίο στέλνουμε μηνύματα από αυτό το τελικό σημείο.SmartLifecycle
χαρακτηριστικό για να καθορίσετε εάν αυτό το τελικό σημείο θα ξεκινήσει αυτόματα μετά την έναρξη του περιβάλλοντος εφαρμογής ή όχι. Η προεπιλεγμένη τιμή του είναι 0
.RedisConnectionFactory
χαρακτηριστικό για τον καθορισμό της φάσης στην οποία θα ξεκινήσει αυτό το τελικό σημείο. Η προεπιλεγμένη τιμή του είναι MessageChannel
.ErrorMessages
φασόλι.Exceptions
στο οποίο θα στείλουμε Endpoint
με MessagePublishingErrorHandler
από την εργασία ακρόασης του errorChannel
. Από προεπιλογή, το υποκείμενο RedisSerializer
χρησιμοποιεί την προεπιλεγμένη byte[]
από το πλαίσιο εφαρμογής.Message
αναφορά φασολιών. Μπορεί να είναι μια κενή συμβολοσειρά, που σημαίνει ότι δεν υπάρχει σειριοποιητής. Σε αυτήν την περίπτωση, η πρώτη JdkSerializationRedisSerializer
από το εισερχόμενο μήνυμα Redis αποστέλλεται στο κανάλι ως το true
φορτίο επί πληρωμή. Από προεπιλογή, είναι ένα false
.TaskExecutor
, το πρόγραμμα σειριοποίησης δεν μπορεί να είναι κενή συμβολοσειρά, επειδή τα μηνύματα απαιτούν κάποια μορφή αποεριοποίησης (από προεπιλογή JDK σειριοποίηση). Η προεπιλεγμένη τιμή του είναι SimpleAsyncTaskExecutor
.true
(ή τυπικό JDK 1.5+ Executor) φασόλι. Χρησιμοποιείται για την υποκείμενη εργασία ακρόασης. Από προεπιλογή, a false
χρησιμοποιείται.true
) ή αριστερό ποπ (πότε false
) για να διαβάζει μηνύματα από τη λίστα Redis. Εάν true
, η λίστα Redis λειτουργεί ως ουρά FIFO όταν χρησιμοποιείται με έναν προεπιλεγμένο προσαρμογέα εξερχόμενου καναλιού ουράς Redis. Ορίστε σε json-to-object-transformer
για χρήση με λογισμικό που γράφει στη λίστα με το δεξί πάτημα ή για να επιτύχετε μια σειρά μηνυμάτων σαν στοίβα. Η προεπιλεγμένη τιμή του είναι type='com.toptal.integration.spring.model.PostPublishedEvent'
.Το σημαντικό μέρος είναι ο 'ενεργοποιητής υπηρεσίας', ο οποίος καθορίζει ποια υπηρεσία και μέθοδο πρέπει να χρησιμοποιούνται για την επεξεργασία του συμβάντος. '
Επίσης, το SpringIntegrationConfig
χρειάζεται ένα χαρακτηριστικό type για να μετατρέψει το JSON σε αντικείμενα, που ορίστηκε παραπάνω σε public interface EventProcessingService { void process(PostPublishedEvent event); } @Service('RedisEventProcessingService') public class RedisEventProcessingService implements EventProcessingService { @Override public void process(PostPublishedEvent event) { // TODO: Send emails here, retry strategy, etc :) } }
.
Και πάλι, για να συνδέσουμε αυτήν τη διαμόρφωση, θα χρειαζόμαστε το 'BRPOP' 'my-event-queue' '1'
τάξη, η οποία μπορεί να είναι η ίδια όπως και πριν. Και τέλος, χρειαζόμαστε μια υπηρεσία που θα επεξεργαστεί πραγματικά την εκδήλωση.
|_+_|
Μόλις εκτελέσετε την εφαρμογή, μπορείτε να δείτε στο Redis:
|_+_|
Με το Spring Integration και το Redis, η δημιουργία μιας εφαρμογής μικρο-υπηρεσιών Spring δεν είναι τόσο τρομακτική όσο θα ήταν κανονικά. Με λίγη διαμόρφωση και μικρό αριθμό κωδικών πλακέτας, μπορείτε να δημιουργήσετε τα θεμέλια της αρχιτεκτονικής μικροϋπηρεσιών σας σε χρόνο μηδέν.
Ακόμα κι αν δεν σκοπεύετε να χαράξετε το τρέχον έργο Spring και να μεταβείτε σε μια νέα αρχιτεκτονική, με τη βοήθεια του Redis, είναι πολύ απλό να αποκτήσετε τεράστιες βελτιώσεις απόδοσης με ουρές.
React από την πλευρά του διακομιστή έναντι της πλευράς πελάτη
Μια εφαρμογή που βασίζεται σε μικροσυσκευές είναι ένα κατανεμημένο σύστημα που λειτουργεί σε πολλά μηχανήματα. Κάθε υπηρεσία στο σύστημα επικοινωνεί μεταδίδοντας μηνύματα στους άλλους.
Σε μια μονολιθική εφαρμογή, όλα τα στοιχεία βρίσκονται στην ίδια διαδικασία και η επικοινωνία βασίζεται συνήθως σε κλήσεις μεθόδου ή λειτουργίας εντός της ίδιας διαδικασίας.