העברת הודעות RabbitMQ עם AMQP באביב

1. הקדמה

במדריך זה נחקור את המושג אוהד והחלפת נושאים עם Spring AMQP ו- RabbitMQ.

ברמה גבוהה, חילופי אוהדים רָצוֹן לשדר את אותה הודעה לכל התורים המאוגדים, בזמן חילופי נושאים השתמש במקש ניתוב עבור העברת הודעות לתור או תורים מסוימים.

מומלץ לקריאה מוקדמת של מסרים עם אביב AMQP להדרכה זו.

2. הקמת מרכזיית Fanout

בואו נקים חילופי אוהדים עם שני תורים הקשורים אליו. כאשר אנו שולחים הודעה למרכזיה זו שני התורים יקבלו את ההודעה. חילופי האוהדים שלנו מתעלמים מכל מפתח ניתוב הכלול בהודעה.

אביב AMQP מאפשר לנו לצבור את כל הצהרות התורים, החילופים והאיגודים ב- a ניתן להצהרה לְהִתְנַגֵד:

@Bean הציבור Declarables fanoutBindings () {Queue fanoutQueue1 = תור חדש ("fanout.queue1", שקר); Queue fanoutQueue2 = תור חדש ("fanout.queue2", שקר); FanoutExchange fanoutExchange = FanoutExchange חדש ("fanout.exchange"); להחזיר Declarables חדשים (fanoutQueue1, fanoutQueue2, fanoutExchange, bind (fanoutQueue1) .to (fanoutExchange), BindingBuilder.bind (fanoutQueue2) .to (fanoutExchange)); }

3. הקמת חילופי נושאים

כעת, נקבע גם חילופי נושאים עם שני תורים, כל אחד עם דפוס כריכה שונה:

@Bean ציבורי Declarables topicBindings () {תור נושאQueue1 = תור חדש (topicQueue1Name, שקר); נושא תורQueue2 = תור חדש (topicQueue2Name, שקר); TopicExchange topicExchange = חדש TopicExchange (topicExchangeName); להחזיר Declarables חדשים (topicQueue1, topicQueue2, topicExchange, BindingBuilder .bind (topicQueue1) .to (topicExchange) .with ("*. חשוב. *"), BindingBuilder .bind (topicQueue2) .to (topicExchange). עם ("#. שְׁגִיאָה")); }

חילופי נושאים מאפשרים לנו לקשור אליו תורים עם דפוסי מפתח שונים. זה מאוד גמיש ומאפשר לנו לאגד מספר תורים עם אותה תבנית או אפילו מספר רב של תבניות לאותו התור.

כאשר מפתח הניתוב של ההודעה תואם לתבנית, הוא ימוקם בתור. אם בתור יש כריכות מרובות התואמות למפתח הניתוב של ההודעה, רק עותק אחד של ההודעה ממוקם בתור.

דפוסי הכריכה שלנו יכולים להשתמש בכוכבית ("*") כדי להתאים מילה במיקום מסוים או בסימן פאונד ("#") כדי להתאים לאפס או יותר מילים.

אז שלנו topicQueue1 יקבלו הודעות עם מקשי ניתוב עם תבנית של שלוש מילים כשהמילה האמצעית היא "חשובה" - לדוגמא: "User.important.error" אוֹ "Blog.important.notification".

ושלנו topicQueue2 יקבלו הודעות עם מקשי ניתוב המסתיימים בשגיאת המילה; דוגמאות תואמות הן "שְׁגִיאָה", "User.important.error" אוֹ "Blog.post.save.error".

4. הקמת מפיק

נשתמש ב- convertAndSend שיטת ה- RabbitTemplate לשלוח הודעות לדוגמא שלנו:

 הודעת מחרוזת = "משודר מטען"; החזר טענות -> {rabbitTemplate.convertAndSend (FANOUT_EXCHANGE_NAME, "", "fanout" + הודעה); rabbitTemplate.convertAndSend (TOPIC_EXCHANGE_NAME, ROUTING_KEY_USER_IMPORTANT_WARN, הודעה "חשוב להזהיר נושא" + הודעה); rabbitTemplate.convertAndSend (TOPIC_EXCHANGE_NAME, ROUTING_KEY_USER_IMPORTANT_ERROR, "הודעת שגיאה חשובה" + הודעה); };

ה RabbitTemplate מספק עומסים רבים convertAndSend () שיטות לסוגי חילופי דברים שונים.

כאשר אנו שולחים הודעה לחילופי אוהדים, מתעלמים ממפתח הניתוב וההודעה מועברת לכל התורים המאוגדים.

כאשר אנו שולחים הודעה להחלפת הנושאים, עלינו להעביר מפתח ניתוב. על סמך מפתח ניתוב זה ההודעה תועבר לתורים ספציפיים.

5. קביעת תצורה של צרכנים

לבסוף, בואו נקבע ארבעה צרכנים - אחד לכל תור - כדי לאסוף את ההודעות שהופקו:

 @RabbitListener (תורים = {FANOUT_QUEUE_1_NAME}) בטל פומבי קבלת הודעהFromFanout1 (הודעת מחרוזת) {System.out.println ("התקבלה הודעה אחת מניפה:" + הודעה); } @RabbitListener (תורים = {FANOUT_QUEUE_2_NAME}) בטל ציבורי בטל קבלת הודעהFromFanout2 (הודעת מחרוזת) {System.out.println ("התקבלה הודעה 2 מאוורר:" + הודעה); } @RabbitListener (תורים = {TOPIC_QUEUE_1_NAME}) חלל ציבורי קבלת הודעהFromTopic1 (הודעת מחרוזת) {System.out.println ("נושא שהתקבל 1 (" + BINDING_PATTERN_IMPORTANT + ") הודעה:" + הודעה); } @RabbitListener (תורים = {TOPIC_QUEUE_2_NAME}) חלל ציבורי קבלת הודעהFromTopic2 (הודעת מחרוזת) {System.out.println ("נושא שהתקבל 2 (" + BINDING_PATTERN_ERROR + ") הודעה:" + הודעה); }

אנו מגדירים צרכנים באמצעות @RabbitListener ביאור. הטיעון היחיד שהועבר כאן הוא שם התורים. הצרכנים אינם מודעים כאן להחלפות או למפתחות ניתוב.

6. הפעלת הדוגמא

פרויקט הדוגמה שלנו הוא יישום Spring Boot, ולכן הוא יאותחל את היישום יחד עם חיבור ל- RabbitMQ ויגדיר את כל התורים, החלפות והקישורים.

כברירת מחדל, היישום שלנו מצפה למופע של RabbitMQ הפועל ב- localhost ביציאה 5672. אנו יכולים לשנות ברירות מחדל אלה ואחרות ב application.yaml.

הפרויקט שלנו חושף את נקודת הקצה של HTTP ב- URI - /מִשׁדָר - שמקבל הודעות עם הודעה בגוף הבקשה.

כאשר אנו שולחים בקשה ל- URI זה עם גוף "Test" עלינו לראות משהו דומה לזה בפלט:

הודעה 1 שהתקבלה מאוורר: משודר מטען מאוורר משודרת הודעה בנושא נושא 1 (*. חשוב. *): נושא חשוב מזהיר מטען משודר הודעה בנושא נושא 2 (מספר. שגיאה): נושא מטען שגיאה חשוב משודר הודעה אוהדת 2 שהתקבלה: מטען מניפה משודר הודעה שהתקבלה בנושא 1 (* .חשוב. *): נושא מטען שגיאה חשוב משודר

הסדר בו נראה הודעות אלו אינו מובטח כמובן.

7. מסקנה

במדריך מהיר זה סקרנו חילופי אוהדים ונושאים עם Spring AMQP ו- RabbitMQ.

קוד המקור השלם וכל קטעי הקוד עבור הדרכה זו זמינים במאגר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found