Trong phong cách thiết kế cloud (hay microservices), những ứng dụng được chia thành những khối độc lập bé dại hơn để có thể dễ dàng develop, deploy và maintain. Hãy thử tưởng tượng bạn có một bản vẽ xây dựng cloud có khá nhiều service và các request từng giây, chúng ta phải bảo đảm rằng ko có bất kể một request như thế nào bị mất và web service của người tiêu dùng luôn luôn luôn sẵn sàng chào đón request new thay vì locked bởi vì đang xử lí request trước đó cũng như phải bảo đảm an toàn rằng những service tiếp xúc với nhau một biện pháp trơn tru cùng hiệu quả.

Bạn đang xem: Message broker là gì

Bạn sẽ xem: Message broker là gì

Vậy các bạn làm nỗ lực nào? Câu vấn đáp đó đó là Message Broker!

Message broker là gì?

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


*

Message Broker pattern sequence diagram

Như ta rất có thể thấy, trong quá trình Initialize, Service1 với Sevice2 init, rồi sau đó load proxy cùng register đến Broker. Tự đó, Broker vẫn trung chuyển những message đến với proxy đã được register từ trước. Pattern này sẽ có những tiện ích sau:

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

Hiện tại có tương đối nhiều các message broker software rất có thể kể mang đến như: Amazon website Services (AWS) Simple Queue Service (SQS), Apache Kafka, Apache ActiveMQ. Nhưng thịnh hành nhất trong số những cái brand name kể trên sẽ là RabbitMQ!

RabbitMQ là gì?

RabbitMQ là 1 trong những Message broker open-source, ban sơ được sử dụng cho Advanced Message Queuing Protocol (AMQP), tiếp nối đã được cải cách và phát triển để hỗ trợ Streaming Text Oriented Messaging Protocol (STOMP), Message Queuing Telemetry Transport (MQTT), và mọi giao thức khác. Tuy nhiên, trong nội dung bài viết này thì mình sẽ không còn đi sâu vào những protocol nói trên. RabbitMQ được viết bởi Erlang, một ngôn từ không phổ cập nhưng khá phù hợp với các các bước của Message Broker.

RabbitMQ với trong messaging nói chung áp dụng những thuật như sau:

Producing tất cả nghĩa dễ dàng là gửi. Ứng dụng nhờ cất hộ message được điện thoại tư vấn là Producer.


*

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


*

Consuming tất cả nghĩa tương tự như như nhận. Consumer là 1 ứng dụng đa phần chờ để thừa nhận message:


*

Hello World!

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


*

Đầu tiên, ta cài đặt Bunny:

gem install bunny --version ">= 2.13.0"

Sending


Chúng ta đã viết message producer trong sender.rb và message consumer vào receiver.rb. producer sẽ liên kết đến RabbitMQ, giữ hộ một message rồi exit.

#!/usr/bin/env rubyrequire "bunny"connection = Bunny.new(hostname: "rabbit.local")connection.startconnection sẽ lấy một socket connection, xử lý version của protocol, xác thực và phần đa thứ khác. Trong lấy ví dụ này, ta sẽ connect mang đến local, nếu muốn connect mang lại một host không giống thì chỉ cần dùng option :hostname và chỉ định và hướng dẫn domain name hoặc showroom IP của nó. Tiếp đến, bọn họ tạo một channel, một queue để gửi message:

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

connection.close

Receiving

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


Tương trường đoản cú như producer, ta mở connection cùng channel, khai báo queue, chú ý rằng thương hiệu của queue bắt buộc giống queue bên sender.rb:

#!/usr/bin/env rubyrequire "bunny"connection = Bunny.new(hostname: "rabbit.local")connection.startchannel = connection.create_channel # chế tạo ra một channelqueue = channel.queue("hello") # chế tạo queue với tên kiểu như với sender.rbỞ đây, ta cũng khai báo queue để chắc chắn rằng rằng queue sẽ tồn tại trước khi consumer message.

Xem thêm: Giọng Hát Liêu Trai Chí Dị ", Những Điều Bạn Chưa Biết Về Liêu Trai Chí Dị

Bunny::Queue#subscribe vẫn deliver message tự queue và nó cũng là 1 trong những callback được thực hiện khi RabbitMQ đẩy message cho consumer một cách bất đồng bộ:

Bây giờ, chạy consumer:

ruby receiver.rbsau kia chạy sender:

ruby sender.rbconsumer đang in message nó cảm nhận từ producer trải qua RabbitMQ. Consumer vẫn vẫn tiếp tục chạy để đợi message.