Learn Rabbit MQ
I. Giới thiệu RabbitMQ:
- RabbitMQ: là một message broker sử dụng giao thức AMQP (Advanced Message Queue Protocol).
Đóng vai trò điều phối trung gian các yêu cầu message giữa producer và comsumer. Đây là nơi giao tiếp giữa các thành phần trong hệ thống lớn như micro service để hiểu nhau.
Đóng vai trò điều phối trung gian các yêu cầu message giữa producer và comsumer. Đây là nơi giao tiếp giữa các thành phần trong hệ thống lớn như micro service để hiểu nhau.
II. Vì sao cần rabbitmq:
- Để dễ cho việc debug, maintain thì mỗi thành phần phải làm việc chuyên biệt về 1 một vụ nào đó. Để cho các thành phần biết nhau thay vì liên kết trực tiếp thì sinh ra 1 đứa trung gian thực hiện yêu cầu vận chuyển thông tin được gọi là message broker. Các producer chỉ việc publish message vào queue trong message broker. Và đứa kia là consumer thì thực hiện đăng ký vào queue này để nhận message. Vì thế producer không hề quen biết với thèn consumer.
- Có một câu hỏi đặt ra là tại sao chúng ta không lưu vào trong db còn sinh ra thèn message broker này nhỉ ?. Là vì:
+ Việc trao đổi message là thường xuyên nên làm tăng load db, làm giảm performance.
+ Trong môi trường multithread, db cũng có cơ chế lock nên cũng làm giảm performance.
+ Vì 2 thèn producer và consumer giao tiếp với nhau thông qua thèn trung gian message broker
nên 2 thèn này có thể thuộc 2 loại đất nước khác nhau: Ruby, PHP, Nodejs, Python, Java,... miễn nó thỏa mãn giao thức với message broker.
+ RabbitMQ đã cung cấp client library cho nhiều ngôn ngữ nên việc tích hợp sử dụng nó là rất linh hoạt.
- NOTE:
+ Đặc tính của rabbitmq: là asynchronus. Nghĩa là producer không biết khi nào message tới consumer, cũng như message này được consumer xử lý xong chưa. Thèn producer chỉ quan tâm là: "Ừ tau đã gởi message tới message broker thành công rồi đó, tau hoàn thành xong nhiệm vụ. Mày có lấy hay không thì tau không quan tâm nữa.". Trong khi đó, thèn consumer đáp: "Ok, khi nào tau thích thì subscriber channel hỏi message broker tau get message về."
+ Nói đến đây, we liền nghĩ tại sao không sử dụng ứng dụng này để thực hiện lưu trữ và chia sẻ log của các ứng dụng cho dev. Log -> message broker-> logstash-> save in elastic để đánh index. Có index này được kibana (web interface) sử dụng truy vấn và hiển thị kết quả.Vậy cần đến sự hổ trợ của ELK stack - Elasticsearch Logstash Kibana chứ nhỉ.
+ Ngẫm nghĩ sao thèn rabbitmq sao nó làm mình nhớ tới người yêu cũ là khả năng mở rộng của redis queue của nhỉ. Chắc do mình con thương nhớ nó.
+ Được biết rabbitmq còn có các tính năng khác nữa :
- cluster: gôm nhiều rabbitmq instance vào trong 1 cluster.1 queue là 1 instance và khi đó có thể truy xuất các instance còn lại. Xây dựng theo mô hình load balancing.
- high availibilty: cho phép failover khi sử dụng mirror queue. (* cần tìm hiểu ở 1 bài viết sau)
- reliability: cơ chế ack để đảm bảo message được nhận bởi consumer đã được xử lý.
III. Sơ đồ hoạt động của rabbitmq:
- Site A: producer
- Site B, C: consumer
-> A connect Message broker để đẩy message đi tới consumer.
- Vậy Message broker cần có gì ?
+ Exchange và Queue
- Exchange: Thực hiện điều hướng message tới queue.có 3 type: direct, topic, fanout ... -> mỗi loại chính là cách quy định đối xử khi nhau với message khi từ producer connect tới message broker.Exchange sẽ được bind đến 1 số Queue nhất định.Vậy type: fanout chính là broadcast message tới các queue được bind tới exchange. Và thèn consumer sẽ connect tới queue của message broker để pop message ra.
- Direct: điều phối message tới Queue theo luật producer đã khai báo trước khi send.
- Topic: điều phối message tới Queue theo loại mà người gởi đã khai báo.
- Fanout: broadcast message cho tất cả các Queue bên trong Message Broker.
- Queue: dùng để lưu trữ message để consumer đến lấy. Message nằm chờ ở đây đến khi nào có thèn consumer muốn lấy thì đến lấy đi.
Theo default RabbitMQ gồm có những gì và công dụng của từng phần:
- Producer: ứng dụng để gởi message.
- Consumer: ứng dụng để nhận message.
- Queue: là bộ đệm để lưu trữ message.
- Message: là nội dụng thông tin từ producer tới consumer thông qua RabbitMQ
- Connection: là kết nối TCP giữa ứng dụng tới RabbitMQ broker.
- Channel: Là một kết nối ảo bên trong connection. Khi publising or consuming từ 1 queue : chúng chung 1 channel.
- Exchange: nhận message từ producer và push chúng tới queue tùy vào các rules được xác định tại exchange type.
- Binding: một binding là một liên kết giữa một queue và một exchange.
- Routing key: có thể xem nó là địa chỉ của message, nó quy định định tuyến message tới Queue.
- AMQP: Advanced Message Queuing Protocol là một giao thức được sử dụng bởi RabbitMQ cho việc send message
- Users: có thể connect tới rabbitMQ sử dụng username và password.Mỗi user có thể được gán permission như: read, write, config privileges bên trong instance.Cũng như chỉ định quyền cho 1 máy ảo cụ thể.
- Vhost, virtual host: cung cấp để tách riêng các ứng dụng khi đang sử dụng chung một rabbitMQ. Ví dụ users khác nhau thì có thể có quyền khác nhau với máy ảo, queue, exchange có thể tạo.Chỉ tồn tại duy nhất trong một vhost.
Nhận xét
Đăng nhận xét