Trong kiến trúc phân tán, các thành phần hệ thống thường cần cung cấp thông tin cho các thành phần khác khi có các sự kiện diễn ra trong hệ thống. Việc gửi thông tin trực tiếp và đồng bộ giữa các thành phần sẽ làm tăng tải cho bộ xử lý thông điệp, khi có sự cố ở một bộ phận thì có thể ảnh hưởng tới bộ phận khác, ngoài ra còn hạn chế khả năng mở rộng của dịch vụ tương tác và trao đổi thông tin.
Khi các hệ thống phức tạp và phân tán trở nên phổ biến, cần có một phương tiện hiệu quả để quản lý và truyền thông giữa các thành phần khác nhau của hệ thống mà không tạo ra sự phụ thuộc giữa chúng. Pub-sub ra đời để giải quyết các vấn đề trên.
1. Pub-Sub là gì? Các thành phần chính của Pub/Sub
Mô hình Publisher-Subscriber (gọi tắt là Pub-Sub) đã xuất hiện khá lâu và trở nên phổ biến trong các hệ thống phân tán vào thập kỷ 70 và những năm sau đó. Các ngôn ngữ lập trình như Smalltalk và các hệ thống như CORBA (Common Object Request Broker Architecture) đã có sự hỗ trợ cho mô hình tương tự từ những năm 1980.
Mô hình Pub-Sub đã tiếp tục phát triển và được tích hợp rộng rãi trong các kiến trúc và framework , như Apache Kafka, RabbitMQ, MQTT, và nhiều công nghệ khác, giúp giải quyết các vấn đề giao tiếp và tương tác trong các hệ thống lớn và phức tạp.
Mô hình Publisher-Subscriber (Pub-Sub) là một kiến trúc phần mềm linh hoạt được sử dụng trong các hệ thống phân tán để quản lý sự giao tiếp giữa các thành phần.
Mô hình này bao gồm bốn thành phần chính: Message, Publisher, Subscriber và Topic.
- Message (thông điệp) là dữ liệu được truyền từ người gửi (Publisher) tới người nhận (Subscriber)
- Publisher là thành phần tạo và phát ra các thông điệp, sự kiện hoặc dữ liệu. Mỗi khi có sự thay đổi quan trọng hoặc sự kiện xảy ra, Publisher sẽ gửi thông điệp tới tất cả Subscriber thông qua một thành phần trung gian là Topic.
- Subscriber là thành phần quan tâm đến các thông điệp hoặc sự kiện cụ thể từ Publisher. Subscriber đăng ký để nhận thông điệp từ một hay nhiều chủ đề (topics) cụ thể. Khi có thông điệp mới được xuất bản trong chủ đề đó, người đăng ký sẽ nhận được thông báo.
- Topic là thành phần trung gian kết nối Publisher và Subscriber. Publisher phát ra thông điệp vào một hoặc nhiều Topic. Subscriber chỉ nhận thông điệp từ những Topic mà họ đã đăng ký.
2. Cơ chế truyền thông điệp của Pub/Sub
Publisher hoạt động về cơ bản giống như một cơ chế phát sóng. Nó có một kênh đầu vào được chia thành nhiều kênh đầu ra, tương ứng một kênh cho mỗi Subscriber.
Khi một sự kiện được xuất bản trên kênh, một bản sao của thông điệp sẽ được gửi đến từng kênh đầu ra. Mỗi kênh đầu ra chỉ có Subscriber gắn liền với nó. Mỗi Subscriber chỉ có thể sử dụng thông điệp một lần. Bằng cách này, mỗi Subscriber chỉ nhận được thông điệp một lần và các bản sao của chúng sẽ biến mất khỏi kênh sau khi chúng được gửi cho tất cả Subcriber.
3. Ưu điểm của Pub/Sub
- Khả năng mở rộng (Scalability): Sự tách biệt giữa các thành phần trong mô hình khiến nó có khả năng mở rộng cao. Mô hình có xử lý lượng lớn Pulisher và Subscriber mà không ảnh hưởng tới hiệu suất.
- Đáng tin cậy (Reliability): Thông điệp luôn đảm bảo sẽ được chuyển tới Subscriber ngay cả khi người đó không hoạt động trên mạng hoặc đứt kết nối.
- Loose coupling: Publisher và Subscriber giao tiếp thông qua thành phần trung gian (Topic) giúp chúng hoạt động một cách độc lập và không ảnh hưởng tới nhau.
4. Nhược điểm của Pub/Sub
- Quản lý tài nguyên: Trong mô hình Pub-Sub, Publisher và Subcriber không giao tiếp trực tiếp với nhau. Điều này có thể tạo ra thách thức trong việc quản lý tài nguyên, đặc biệt là khi cần theo dõi và giải phóng tài nguyên đã sử dụng.
- An toàn dữ liệu: Thông điệp được truyền tải qua mạng có thể dẫn tới mất an toàn thông tin. Điều này đặc biệt quan trọng nếu hệ thống đang làm việc trong môi trường không tin cậy.
- Phức tạp khi debugging và tracing: Vì thông điệp được truyền tải giữa Publisher và Subscriber qua trung gian là Topic, nên việc theo dõi và gỡ lỗi (debugging) có thể trở nên phức tạp hơn so với các mô hình giao tiếp trực tiếp.
5. Khi nào nên sử dụng Pub/Sub?
Với các ưu điểm cùng nhược điểm trên, các nhà phát triển có thể cân nhắc sử dụng mô hình Pub-Sub cho các trường hợp sau:
- Cần phải xử lý song song nếu một thông điệp có các quy trình công việc khác nhau.
- Không cần phải phát thông điệp tới nhiều Subscriber và phản hồi theo thời gian thực từ người nhận.
- Ứng dụng hoặc thành phần phải giao tiếp với các ứng dụng hoặc dịch vụ khác mà chúng có thể đang sử dụng các ngôn ngữ, giao thức hoặc nền tảng khác.
6. Ứng dụng của Pub-Sub
Mô hình Pub-Sub có thể được xử dụng trong nhiều hệ thống phức tạp và phân tán. Chúng ta sẽ tìm hiểu một số trường hợp sử dụng mô hình này, bao gồm cập nhật theo thời gian thực trong trò chơi trực tuyến, nhà thông minh với IoT, phân phối dữ liệu trong phân tích dữ liệu và quản lý sự kiện trong môi trường đám mây.
3.1. Trò chơi trực tuyến
Trong trò chơi trực tuyến, nơi Publisher có thể gửi thông tin cập nhật theo thời gian thực về vị trí của người chơi, thay đổi điểm số và sự kiện trò chơi tới tất cả Subscirber.
Nhìn chung, điều này nâng cao trải nghiệm chơi trò chơi và đảm bảo tất cả người chơi đều nhận được các bản cập nhật giống nhau cùng một lúc.
3.2. Ngôi nhà thông minh với IoT
Mô hình pub-sub cũng được sử dụng trong nhà thông minh để gửi và xử lý thông điệp từ thiết bị cảm biến đến server. Ví dụ: bạn có thể sử dụng mô hình này để bật đèn khi có người bước vào phòng.
Về cơ bản, trường hợp sử dụng này thể hiện cách mô hình pub-sub cho phép giao tiếp giữa các thành phần khác nhau trong hệ thống IoT.
3.3. Phân tích dữ liệu
Các công ty tài chính có thể sử dụng nó để phân phối thông tin cập nhật về các công cụ tài chính cụ thể theo thời gian thực cho các nhà giao dịch đã đăng ký với công ty.
3.4. Quản lý sự kiện trong môi trường Cloud
Các dịch vụ đám mây thường sử dụng Pub-Sub để quản lý sự kiện, thông báo và tích hợp giữa các thành phần khác nhau trong môi trường đám mây.
4. Kết luận
Mô hình Publisher-Subscriber (Pub-Sub) đã chứng minh sự hiệu quả và linh hoạt của nó trong nhiều ứng dụng và lĩnh vực khác nhau. Pub-Sub không phải là một giải pháp đặc biệt cho mọi vấn đề, nhưng với tính linh hoạt và khả năng thích ứng khiến nó trở thành một mô hình quan trọng trong thiết kế hệ thống phức tạp và phân tán.
Ngoài ra, bạn có thể tham khảo thêm các công nghệ có sử dụng mô hình Pub-Sub.
Đón đọc thêm các bài viết về RabbitMQ, Kafka bên dưới nhé!