Trong các hệ thống lớn và phân tán, đặc biệt là các hệ thống sử dụng kiến trúc Microservice thì không thể thiếu một thành phần quan trọng là Message queue.
Vậy Message queue là gì, nó hoạt động ra sao và giúp giải quyết được những vấn đề gì mà các hệ thống lớn không thể thiếu nó. Chúng ta sẽ cùng tìm hiểu về Message queue trong bài viết này.
1. Message queue là gì?
Message queue là một cơ chế trong lập trình và kiến trúc phần mềm, được sử dụng để truyền thông tin (thông điệp) giữa các thành phần của hệ thống mà không cần chúng tương tác trực tiếp với nhau.
2. Các thành phần chính của Message queue
Message queue gồm các thành phần chính như sau:
- Producer: bộ phân tạo ra thông tin để tương tác với bộ phận khác. Thông tin này sẽ được truyền vào Message queue.
- Consumer:bộ phận/thành phần trong hệ thống nhận thông tin và xử lý thông tin từ Producer thông qua Message queue.
- Message: Thông tin (thông điệp) thường ở dạng text hoặc JSON, đôi khi có thể là Binary do Producer tạo ra.
- Message queue: Nơi lưu trữ tạm thời Message cho tới khi được Consumer lấy ra và xử lý.
- Broker: Xử lý Message và quản lý Message queue để đảm bảo Producer và Consumer truyền thông tin được cho nhau. Broker giúp định tuyến thông tin, quản lý tình trạng của hàng đợi, và đảm bảo rằng thông tin được chuyển giao đúng cách.
- Channel: Là cơ chế truyền thông tin giữa producer và consumer thông qua Message Queue. Channel đóng vai trò như một cầu nối để truyền thông điệp qua lại giữa các bên.
3. Cách thức hoạt động của Message queue:
- Bước 1: Producer tạo ra thông điệp cần truyền đi. Thông tin này có thể là dữ liệu hoặc các thông tin bổ sung. Thông tin này sẽ được truyền vào Mesage queue thông qua channel và được lưu trữ tạm thời tại đây.
Ví dụ: nếu chúng ta phải cập nhật danh mục, tên, mô tả về một sản phẩm.
Thông điệp mà Producer tạo và đưa vào Message queue sẽ trông giống như sau:
{
"product_id": 12345,
"category": 567,
"productname": "Nike Zoom ZX 2024",
"description": "Made in Vietnam"
}
- Bước 2: Consumer sẽ lấy thông điệp của Producer thông qua Message queue. Thông tin thường được được lấy theo cơ chế FIFO (first in - first out), tuy nhiên vẫn có thể can thiệp vào cơ chế này bằng cách định ra các ưu tiên.
- Bước 3: Sau khi Consumer lấy được thông tin sẽ tiếp tục xử lý và thực hiện các hành động tuỳ thuộc vào yêu cầu của hệ thống.
Quá trình này tạo ra một mô hình truyền và nhận thông tin linh hoạt và không đồng bộ giữa các thành phần của hệ thống. Producer và consumer không cần biết về sự tồn tại của nhau; thay vào đó, chúng tương tác thông qua hàng đợi được quản lý bởi Broker. Điều này giúp tăng tính mở rộng và giảm sự phụ thuộc giữa các thành phần trong hệ thống.
4. Ưu điểm của Message Queue
- Bất đồng bộ: Message Queue hỗ trợ truyền thông điệp giữa các thành phần mà không đòi hỏi chúng phải chờ đợi nhau. Điều này giúp cải thiện hiệu suất và tăng tính mở rộng của hệ thống.
- Tính độc lập : Producer và consumer không cần biết về sự tồn tại của nhau. Sự phân tách này giúp giảm sự phụ thuộc giữa các thành phần và tăng khả năng mở rộng của hệ thống.
- Xử lý lưu lượng cao: Message Queue có thể xử lý lượng thông điệp lớn và đồng thời từ nhiều nguồn mà không gây ảnh hưởng lớn đến hiệu suất của hệ thống.
- Đảm bảo giao tiếp tin cậy: Hệ thống Message Queue thường có cơ chế đảm bảo rằng việc trao đổi thông tin giữa Producer và Consumer được chính xác và xử lý đúng cách.
- Giảm lỗi chồng chéo : Message Queue giúp giảm lỗi chồng chéo bằng cách loại bỏ trực tiếp kết nối giữa các thành phần, giảm khả năng lỗi do sự phụ thuộc và giao tiếp trực tiếp.
- Khả năng phục hồi: Do các thành phần hoạt động hoàn toàn độc lập với nhau nên khi một thành phần gặp sự cố thì thành phần kia vẫn có thể hoạt động bình thường. Việc bảo trì, sửa chữa hệ thống cũng không quá phức tạp.
5. Nhược điểm của Message Queue
- Phức tạp hóa hệ thống: Sử dụng Message Queue có thể làm phức tạp hóa hệ thống và tốn kém. Đối với các hệ thống nhỏ, đôi khi triển khai Message queue là không cần thiết.
- Độ trễ : Việc trao đổi thông tin bất đồng bộ giữa các thành phần sẽ có một độ trễ nhất định.
- Chi phí xử lý: Message Queue sẽ tăng tải của hệ thống nếu phải xử lý lượng lớn thông tin.
- Quản lý và theo dõi: Khi hệ thống có nhiều hàng đợi, hoặc có nhiều Producer/consumer thì việc quản lý và theo dõi hoạt độngc ủa Message queue sẽ gặp nhiều khó khăn.
- Khó xử lý đồng bộ: Khi hệ thống cần xử lý đồng bộ giữa các service thì Message queue không phải lựa chọn hàng đầu mà phải chọn các cơ chếkhác phù hợp hơn như Rest hoặc rGPC
6. Ứng dụng của Message queue trong thực tế
Trong thực tế, Message queue giải quyết được rất nhiều vấn đề quan trọng trong hệ thống như:
- Message được lưu giữ trong hàng đợi (queue) nên khi các thành phần xử lý gặp lỗi hoặc bộ phận trong hệ thống gặp sự cố thì không mất dữ liệu. Khi hệ thống được phục hồi thì có thể tiếp tục lấy message trong queue để xử lý tiếp.
- Khi số lượng Message quá lớn, thì cơ chế xử lý bất đồng bộ sẽ phát huy hiệu quả. Các Message sẽ được xử lý dần dần cho tới khi hoàn tất mà không sợ bị thất thoát thông tin hoặc gây quá tải cho hệ thống.
- Các thành phần hoạt động tách biệt nên dễ dàng mở rộng hệ thống. Trong thực tế có những thời điểm lượng message tăng cao thì có thể tăng lượng consumer lên để xử lý.
Do những đặc điểm ưu việt trên mà Message queue được sử dụng nhiều trong các hệ thống phân tán và phức tạp. Dưới đây là một số trường hợp thực tế:
- Xử lý đơn hàng và Thanh Toán Trực Tuyến:
Trong môi trường thương mại điện tử, khi một đơn hàng được đặt thành công, thông tin đơn hàng có thể được xếp vào hàng đợi để hệ thống xác nhận đơn hàng xử lý, xử lý thanh toán và cập nhật trạng thái đơn hàng.
- Xử Lý Sự Kiện Real-time
Trong ứng dụng cần xử lý sự kiện real-time như theo dõi và phân tích dữ liệu sensor, Message Queue có thể đóng vai trò là cầu nối để truyền thông điệp giữa các thành phần xử lý sự kiện.
- Chia Sẻ Dữ Liệu Giữa Ứng Dụng và Dịch Vụ
Message Queue được sử dụng để chia sẻ dữ liệu giữa các ứng dụng và dịch vụ khác nhau. Điều này giúp đơn giản hóa tích hợp và giảm sự phụ thuộc trực tiếp giữa các thành phần.
7. Tổng kết
Hiện nay, Message queue được tích hợp trong rất nhiều hệ thống và dịch vụ lớn, điển hình như:
Việc sử dụng Message Queue nên được đánh giá dựa trên yêu cầu cụ thể của dự án. Trong nhiều trường hợp, ưu điểm của nó về khả năng mở rộng và độ linh hoạt là quan trọng hơn so với nhược điểm, giúp xây dựng các hệ thống phân tán hiệu quả và dễ quản lý.
Đọc thêm những bài viết liên quan đến lập trình backend tại blog 200Lab Software Architect là gì? Lộ trình trở thành Software Architect, Golang Channel là gì? Các ứng dụng Channel trong Golang, OpenTelemetry: Công cụ giám sát và tối ưu hóa ứng dụng v.v