RabbitMQ là một message broker ( message-oriented middleware) sử dụng giao thức AMQP – Advanced Message Queue Protocol (Đây là giao thức phổ biến, thực tế rabbitmq hỗ trợ nhiều giao thức). Trong IoT đây là thuật ngữ bạn sẽ thường xuyên gặp trong một số platform thông dụng.
RabbitMQ được lập trình bằng ngôn ngữ Erlang. RabbitMQ cung cấp cho lập trình viên một phương tiện trung gian để giao tiếp giữa nhiều thành phần trong một hệ thống lớn. RabbitMQ sẽ nhận message đến từ các thành phần khác nhau trong hệ thống, lưu trữ chúng an toàn trước khi đẩy đến đích.
Nội dung
- 1 Messaging là gì ?
- 2 Đặc điểm của Messaging là gì ?
- 3 Lịch sử của Messaging
- 4 Tại sao Messaging lại không hoạt động
- 5 AMQP là gì ?
- 6 Lịch sử của AMQP
- 7 Chìa khóa chính của AMQP là gì
- 8 Sơ đồ hoạt động của AMQP
- 9 AMQP Message Brokers
- 10 RabbitMQ là gì ?
- 11 Tại sao lại sử dụng RabbitMQ
- 12 Mô hình hoạt động của RabbitMQ
- 13 Client Libraries & Community Libraries
- 14 Protocol Gateways
- 15 Ứng dụng thực tế của RabbitMQ
Messaging là gì ?
Làm thế nào bạn có thể tích hợp nhiều ứng dụng để chúng làm việc cùng nhau và có thể trao đổi thông tin lẫn nhau
Đặc điểm của Messaging là gì ?
- Asynchronous – Bất đồng bộ
- Reliable – Đúng đắn
- Durable – Bền vững
- Routing – Định tuyến
- Many message formats – Nhiều định dạng
- Recipient pulls message from queue – Nhận thông báo từ hàng đợi
Lịch sử của Messaging
- 1986 The Information Bus (TIB) developed
- 1993 IBM MQSeries released
- 1997 Microsoft MSMQ released
- 2001 Java Messaging Service released
Tại sao Messaging lại không hoạt động
- Nhắn tin đã có hàng thế kỷ
- Giải pháp tin nhắn là chìa khóa cho rất nhiều hệ thống giải quyết các vấn đề về liên kết với nhau
- Nhưng khó khăn của nó là:
- Việc xây dựng hệ thống đó rất khó khăn
- Việc mua và sử dụng chúng tốn rất nhiều tiền
- Khó kết nối tới nhiều ứng dụng
- Các nhà cung cấp đã cố gắng để xây dựng các sản phẩm quá phức tạp
AMQP là gì ?
- Advanced Message Queue Protocol – Giao thức Message Queue nâng cao
- Developed by JP Morgan Chase and iMatix
- Open standard protocol for messaging – Mở giao thức chuẩn cho Messaging
- Wire level protocol like HTTP
- Vendor agnostic protocol for messaging systems
Lịch sử của AMQP
- 2003 AMQP starts development at JP Morgan
- 2005 AMQP working group formed
- 2006 June AMQP 0-8 released December AMQP 0-9 released
- 2006 Rabbit technologies formed RabbitMQ first release
- 2011 AMQP 1.0 released by AMQP working group
- October 2012 AMQP 1.0 approved as an OASIS standard
Chìa khóa chính của AMQP là gì
- Message Broker
- Exchanges
- Direct
- Fan-out
- Topic
- Headers
- Queues
- Bindings
Sơ đồ hoạt động của AMQP
AMQP Message Brokers
- RabbitMQ
- Windows Azure Service Bus
- Apache Qpid
- Apache ActiveMQ
- SwiftMQ
- StormMQ
- WSO2 message broker
- OpenAMQ
RabbitMQ là gì ?
RabbitMQ là một message broker ( message-oriented middleware) sử dụng giao thức AMQP – Advanced Message Queue Protocol (Đây là giao thức phổ biến, thực tế rabbitmq hỗ trợ nhiều giao thức). RabbitMQ được lập trình bằng ngôn ngữ Erlang. RabbitMQ cung cấp cho lập trình viên một phương tiện trung gian để giao tiếp giữa nhiều thành phần trong một hệ thống lớn. RabbitMQ sẽ nhận message đến từ các thành phần khác nhau trong hệ thống, lưu trữ chúng an toàn trước khi đẩy đến đích.
RabbitMQ chạy trên nhiều hệ điều hành, đám mây và cung cấp một loạt các công cụ dành cho nhà phát triển cho hầu hết các ngôn ngữ phổ biến.
Các Thuật ngữ liên quan đến RabbitMAQ
- AMQP – Advanced Message Queueing Protocol
- EAI – Enterprise Application Integration
- BPM – Business Process Management
- ESB – Enterprise Service Bus
- SOA – Service Orientated Architecture
- MOM – Message Orientated Middleware
- WCF – Windows Communication Foundation
Tại sao lại sử dụng RabbitMQ
Chúng ta thử xem các message broker như rabbitmq đem lại lợi ích gì trong việc thiết kế ứng dụng. Trong một hệ thống phân tán (distributed system), có rất nhiều thành phần. Nếu muốn các thành phần này giao tiếp được với nhau thì chúng phải biết nhau. Nhưng điều này gây rắc rối cho việc viết code. Một thành phần phải biết quá nhiều đâm ra rất khó maintain, debug. Giải pháp ở đây là thay vì các liên kết trực tiếp, khiến các thành phần phải biết nhau thì sử dụng một liên kết trung gian qua một message broker. Với sự tham gia của message broker thì producer sẽ không hề biết consumer. Nó chỉ việc gửi message đến các queue trong message broker. Consumer chỉ việc đăng ký nhận message từ các queue này.
Tất nhiên, có thể có một giải pháp là sử dụng database để lưu các message trong các temporary table. Tuy nhiên xét về hiệu năng thì không thể bằng message broker vì một số lý do: Tần xuất trao đổi message cao sẽ làm tăng load của database, giảm performance đáng kể. Trong môi trường multithread, database cần có cơ chế lock. Lock cũng làm giảm performance. Sử dụng message broker sẽ không có vấn đề này.
Vì producer nói chuyện với consumer trung gian qua message broker nên dù producer và consumer có khác biệt nhau về ngôn ngữ thì giao tiếp vẫn thành công. Dù viết bằng java, python, php hay ruby… thì chỉ cần thỏa mãn giao thức với message broker thì thông suốt hết. HIện nay, rabbitmq cũng đã cung cấp client library cho khá nhiều các ngôn ngữ rồi. Tính năng này cho phép tích hợp hệ thống linh hoạt.
Một đặc tính của rabbitmq là asynchronous. Producer không thể biết khi nào message đến được consumer hay khi nào message được consumer xử lý xong. Đối với producer, đẩy message đến message broker là xong việc. Consumer sẽ lấy message về khi nó muốn. Đặc tính này có thể được tận dụng để xây dựng các hệ thống lưu trữ và xử lý log. ELK stack – Elasticsearch Logstash Kibana là một ví dụ. Đây là hệ thống được sử dụng trong môi trường DevOps khá hiệu quả. Giải quyết bài toán chia sẻ log của ứng dụng cho dev. Log được đẩy vào message broker rồi qua logstash lưu trữ vào elastic để đánh index. Sau đó index được kibana (một web interface) sử dụng để thực hiện truy vấn và hiển thị kết quả
Bên cạnh các lợi ích kể trên, rabbitmq còn có nhiều tính năng thú vị khác như:
- cluster: các bạn có thể gom nhiều rabbitmq instance vào một cluster. Một queue được đinh nghĩa trên một instance khi đó đều có thể truy xuất từ các instance còn lại. Có thể tận dụng để làm load balancing (tuy rằng có hạn chế, tôi sẽ nói sau)
- high availibilty: cho phép failover khi sử dụng mirror queue.
- reliability: có cơ chế ack để đảm bảo message được nhận bởi consumer đã được xử lý.
Mô hình hoạt động của RabbitMQ
Exchange có nhiều loại. Trong hình vẽ trên exchange type là fanout. Lựa chọn các exchange type khác nhau sẽ dẫn đến khác đối xử khác nhau của message broker với thông điệp nhận được từ producer. Exchange được bind (liên kêt) đến một số queue nhất định. Với exchange type là fanout, message sẽ được broadcast đến các queue được bind với exchange. Consumer sẽ connect đến message broker để lấy message từ các queue.
- Producer: thực hiện quá trình gửi bản tin lên RabbitMQ server
- Exchange: thực hiện nhiệm vụ phân phối bản tin, có 3 kiểu phân phối bản tin direct, topic, fanout
- Queues: có nhiệm vụ lưu trữ bản tin được gửi lên
- Consumber: thực hiện việc lấy các bản tin từ queue về
Client Libraries & Community Libraries
- net/WCF
- Java
- Python
- Ruby
- Spring
Protocol Gateways
- XMPP
- Stomp
- Smtp
- Http