AMQP LÀ GÌ

      154

Trong phong cách xây dựng cloud (xuất xắc microservices), những vận dụng được tạo thành số đông kăn năn độc lập nhỏ tuổi rộng để hoàn toàn có thể dễ dàng develop, deploy với maintain. Hãy thử tưởng tượng chúng ta tất cả một kiến trúc cloud có tương đối nhiều service cùng các request mỗi giây, các bạn buộc phải đảm bảo an toàn rằng không có bất kể một request làm sao bị mất và web service của người sử dụng luôn luôn luôn sẵn sàng tiếp nhận request new vắt bởi vì locked vì chưng sẽ cập nhật request trước kia cũng như yêu cầu bảo vệ rằng các service tiếp xúc với nhau một phương pháp suôn sẻ tru với tác dụng.

Bạn đang xem: Amqp là gì

Vậy bạn có tác dụng nắm nào? Câu vấn đáp kia đó là Message Broker!

Message broker là gì?

Message broker (hay nói một cách khác là integration broker hoặc interface engine) là 1 trong những module trung gian trung gửi message từ bỏ người gửi mang đến tín đồ dìm. Nó là một trong quy mô kiến trúc (architentural pattern) nhằm khám nghiệm, trung đưa với điều hướng message; làm trung gian thân các vận dụng với nhau, buổi tối giản hóa giao tiếp giữa các ứng dụng kia với để tăng kết quả tối đa mang đến câu hỏi tách bóc ra các khối hận nhỏ rộng. Nhiệm vụ thiết yếu của một Message broker là chào đón đa số message tự những áp dụng và thực hiện một thao tác làm việc nào kia. Hãy cùng quan sát vào sequence diagram dưới đây:

*


Message Broker pattern sequence diagram

Nlỗi ta hoàn toàn có thể thấy, vào quy trình Initialize, Service1 cùng Sevice2 init, rồi tiếp nối load proxy với register mang lại Broker. Từ đó, Broker đang trung chuyển những message mang lại với proxy đã làm được register từ trước. Pattern này sẽ có các tiện ích sau:

Service1 với Service2 không nên biết nhau. Nó chỉ việc gửi message mang đến proxy, rồi tự đó proxy đã forward message mang đến Broker. Rồi trường đoản cú kia Broker sẽ forward message cho Service1 với Service2 nhưng chúng vẫn đăng kí dìm message trường đoản cú trước.Service1 với Service2 tiếp xúc trung gian qua Broker buộc phải dù cho có khác nhau về ngữ điệu thì vẫn giao tiếp thành công xuất sắc.Với design pattern này, chúng ta có thể thiết đặt cơ chế bất nhất quán (asynchronous). Đối với Service1 thì nó ko cần quan tâm bao giờ message mang đến tay Service2 tốt khi nào Service2 giải pháp xử lý xong xuôi, nó chỉ cần đấy message mang lại Message Broker là chấm dứt câu hỏi. Service2 đã lấy message bất kể bao giờ nó hy vọng. Đặc tính này rất có thể được tận dụng tối đa nhằm tạo những khối hệ thống lưu trữ và cách xử lý log.

Bây Giờ có rất nhiều những message broker software hoàn toàn có thể kể tới như: Amazon Web Services (AWS) Simple Queue Service (SQS), Apache Kafka, Apabịt ActiveMQ. Nhưng phổ biến độc nhất vô nhị trong số các cái tên nói bên trên đó là RabbitMQ!

RabbitMQ là gì?

RabbitMQ là 1 Message broker open-source, thuở đầu được dùng đến Advanced Message Queuing Protocol (AMQP), kế tiếp đã được trở nên tân tiến nhằm cung ứng Streaming Text Oriented Messaging Protocol (STOMP), Message Queuing Telemetry Transport (MQTT), cùng mọi giao thức không giống. Tuy nhiên, vào nội dung bài viết này thì mình sẽ không đi sâu vào các protocol nói trên. RabbitMQ được viết bằng Erlang, một ngữ điệu không thông dụng tuy vậy khá cân xứng cùng với các công việc của Message Broker.

RabbitMQ với trong messaging nói phổ biến thực hiện hồ hết thuật nhỏng sau:

Producing tất cả nghĩa dễ dàng và đơn giản là gửi. Ứng dụng gửi message được Gọi là Producer.

*

Queue là một trong những post box phía trong RabbitMQ. Message di chuyển qua RabbitMQ và ứng dụng của người sử dụng tuy thế chúng chỉ rất có thể được lưu vào queue. Queue được số lượng giới hạn vào memory cùng disk của host. Về bản chất, nó là 1 trong những bộ lưu trữ đệm message cùng với dữ liệu mập. hầu hết producer hoàn toàn có thể gửi message vào một trong những queue và những consumer có thể dấn data xuất phát từ một queue:

*

Consuming gồm nghĩa tựa như nlỗi nhận. Consumer là 1 vận dụng đa phần hóng nhằm nhấn message:

*

Lưu ý rằng producer, consumerbroker không cần thiết phải phụ thuộc vào vào và một host. Trên thực tế không nhiều có những ứng dụng như thế. Một ứng dụng cũng rất có thể vừa là producer với vừa là consumer.

Xem thêm: Hướng Dẫn Cách Làm Thời Trang Làm Từ Phế Liệu 100 Cách Đẹp, Thời Trang Giấy

Hello World!

Trong nội dung bài viết này, họ vẫn dùng Bunny Ruby Client để gia công ví dụ về một producer gửi message cùng một consumer nhấn message với in ra screen. Trong hình dưới đây, Pproducer cùng Cconsumer, box ở giữa là một trong queue:

*

Trước hết, ta thiết đặt Bunny:

gem install bunny --version ">= 2.13.0"

Sending

*

Chúng ta sẽ viết message producer trong sender.rb cùng message consumer vào receiver.rb. producer đã kết nối cho RabbitMQ, gửi một message rồi exit.

#!/usr/bin/env rubyrequire "bunny"connection = Bunny.new(hostname: "rabbit.local")connection.startconnection đang mang một socket connection, giải pháp xử lý version của protocol, đúng đắn với những thứ không giống. Trong ví dụ này, ta đã connect mang lại local, nếu như muốn connect cho một host khác thì chỉ việc dùng option :hostname với chỉ định và hướng dẫn tên miền name hoặc liên hệ IP. của chính nó. Tiếp cho, chúng ta chế tạo ra một channel, một queue nhằm gửi message:

channel = connection.create_channel # chế tạo ra một channelqueue = channel.queue("hello") # chế tạo ra queue thương hiệu là "hello"channel.default_exchange.publish("Hello World!", routing_key: queue.name)puts " Sent "Hello World!""queue đang chỉ được sản xuất nếu nó chưa xuất hiện, message là một trong những byte array cần chúng ta cũng có thể truyền bất cứ sản phẩm công nghệ gì bạn muốn. Cuối cùng, ta cthất bại connecion:

connection.close

Receiving

Giờ, consumer đang listen message từ bỏ RabbitMQ. Khác với producer, consumer sẽ chạy để listen message cùng in chúng ra màn hình.

*

Tương từ như producer, ta mnghỉ ngơi connection với channel, khai báo queue, xem xét rằng thương hiệu của queue cần như là queue bên sender.rb:

#!/usr/bin/env rubyrequire "bunny"connection = Bunny.new(hostname: "rabbit.local")connection.startchannel = connection.create_channel # sản xuất một channelqueue = channel.queue("hello") # tạo ra queue cùng với tên như là cùng với sender.rbTại phía trên, ta cũng knhị báo queue để chắc chắn là rằng queue sẽ sống thọ trước khi consumer message.

Bunny::Queue#subscribe sẽ deliver message từ bỏ queue và nó cũng là 1 trong callback được thực hiện Lúc RabbitMQ đẩy message mang lại consumer một phương pháp bất đồng bộ:

begin puts " <*> Waiting for messages. To exit press CTRL+C" queue.subscribe(block: true) do |_delivery_info, _properties, body| puts " Received #body" endrescue Interrupt => _ connection.cthua thảm exit(0)endTại phía trên, để tránh vấn đề receiver.rb chấm dứt ngay chớp nhoáng, Bunny::Queue#subscribe sử dụng một block để chờ thread được tiến hành.

Bây giờ đồng hồ, chạy consumer:

ruby receiver.rbtiếp đến chạy sender:

ruby sender.rbconsumer đã in message nó nhận ra từ producer trải qua RabbitMQ. Consumer vẫn vẫn thường xuyên chạy nhằm hóng message.