1. Message Broker là gì?

Message Broker là một thành phần trung gian được sử dụng để tiếp nhận, quản lý và chuyển tiếp thông điệp giữa các ứng dụng hoặc các thành phần trong một hệ thống phần mềm. Công nghệ này thường xuất hiện trong những hệ thống Backend, kiến trúc Microservices và các ứng dụng cần xử lý nhiều công việc bất đồng bộ.

Trong quá trình xây dựng phần mềm, không phải lúc nào các thành phần trong hệ thống cũng cần giao tiếp trực tiếp với nhau. Ví dụ, khi người dùng đặt hàng trên một website, hệ thống có thể cần lưu đơn hàng, gửi email xác nhận, cập nhật kho hàng và thông báo cho bộ phận vận chuyển. Nếu mỗi thành phần phải gọi trực tiếp đến tất cả các thành phần còn lại, hệ thống sẽ trở nên phức tạp và khó quản lý khi số lượng chức năng tăng lên.

Message Broker giúp giải quyết vấn đề này bằng cách đóng vai trò trung gian trong quá trình truyền thông điệp. Thay vì một dịch vụ phải liên hệ trực tiếp với dịch vụ khác, nó có thể gửi thông điệp đến Message Broker. Sau đó, Message Broker tiếp nhận và chuyển thông điệp đến thành phần phù hợp theo quy tắc được cấu hình.

Có thể hiểu đơn giản, Message Broker giống như một bộ phận tiếp nhận và phân phối thông tin trong hệ thống. Nó giúp các ứng dụng trao đổi dữ liệu với nhau mà không nhất thiết phải biết chi tiết cách hoạt động bên trong của từng ứng dụng.

Thông điệp được truyền qua Message Broker có thể là thông tin đơn hàng mới, yêu cầu gửi email, thông báo người dùng đăng ký tài khoản hoặc dữ liệu cần xử lý ở một dịch vụ khác. Tùy theo công nghệ và cách thiết kế, Message Broker còn có thể hỗ trợ lưu trữ thông điệp, định tuyến, xác nhận tiếp nhận và xử lý các trường hợp lỗi.Message Broker là gì? Giới Thiệu về Message Broker · 200Lab

2. Tại sao cần sử dụng Message Broker?

Trong quá trình tìm hiểu về lập trình Backend, mình nhận thấy rằng khi một ứng dụng phát triển từ quy mô nhỏ lên quy mô lớn, việc để các thành phần giao tiếp trực tiếp với nhau có thể khiến hệ thống ngày càng khó mở rộng. Mỗi dịch vụ có thể phụ thuộc vào nhiều dịch vụ khác, dẫn đến việc thay đổi một thành phần đôi khi ảnh hưởng đến nhiều phần còn lại.

Message Broker giúp giảm bớt sự phụ thuộc trực tiếp này bằng cách tạo ra một lớp trung gian để trao đổi thông điệp. Các dịch vụ có thể gửi và nhận thông điệp theo những quy tắc đã được thiết lập mà không cần duy trì kết nối trực tiếp với từng thành phần liên quan trong mọi trường hợp.

Một số lợi ích quan trọng của Message Broker gồm:

  • Giảm sự phụ thuộc giữa các dịch vụ: Dịch vụ gửi thông điệp không cần biết toàn bộ cách hoạt động của dịch vụ nhận. Điều này giúp các thành phần dễ phát triển và bảo trì độc lập hơn.
  • Hỗ trợ xử lý bất đồng bộ: Dịch vụ gửi có thể gửi thông điệp và tiếp tục công việc của mình mà không cần chờ tất cả các dịch vụ nhận hoàn thành xử lý.
  • Phân phối thông điệp: Message Broker có thể chuyển thông điệp đến một hoặc nhiều thành phần nhận tùy theo cơ chế định tuyến và loại hệ thống được sử dụng.
  • Hỗ trợ xử lý lượng công việc lớn: Thông điệp có thể được lưu lại để chờ xử lý, giúp hệ thống tiếp nhận công việc ngay cả khi thành phần nhận đang bận, trong giới hạn lưu trữ và cấu hình của hệ thống.
  • Tăng khả năng mở rộng: Khi khối lượng công việc tăng lên, nhóm phát triển có thể bổ sung thêm các thành phần xử lý phù hợp mà không nhất thiết phải thay đổi toàn bộ kiến trúc.
  • Hỗ trợ quản lý lỗi: Một số Message Broker cung cấp cơ chế xác nhận thông điệp, gửi lại hoặc định tuyến thông điệp lỗi để hạn chế việc mất dữ liệu khi xảy ra sự cố.

Tuy nhiên, Message Broker không tự động giải quyết tất cả vấn đề của hệ thống. Lập trình viên vẫn cần thiết kế cơ chế xử lý thông điệp, kiểm soát lỗi và theo dõi hoạt động của các dịch vụ để bảo đảm dữ liệu được xử lý chính xác.Message Broker là gì? Các ứng dụng của Message Broker

3. Message Broker hoạt động như thế nào?

Để hiểu rõ cách hoạt động của Message Broker, có thể lấy ví dụ về một website bán hàng có chức năng đặt hàng trực tuyến. Khi người dùng tạo đơn hàng, hệ thống cần thông báo cho các thành phần khác để tiếp tục thực hiện những công việc liên quan.

Quy trình hoạt động cơ bản thường gồm các bước sau:

Bước 1: Ứng dụng tạo thông điệp.

Khi người dùng đặt hàng, dịch vụ xử lý đơn hàng tạo ra một thông điệp chứa những thông tin cần thiết, chẳng hạn mã đơn hàng, thời điểm tạo đơn và loại sự kiện vừa xảy ra.

Bước 2: Gửi thông điệp đến Message Broker.

Dịch vụ xử lý đơn hàng gửi thông điệp đến Message Broker. Tùy theo công nghệ, thông điệp có thể được đưa vào Queue hoặc được định tuyến thông qua Exchange, Topic hay một cơ chế tương ứng.

Bước 3: Message Broker tiếp nhận và phân phối thông điệp.

Message Broker kiểm tra các quy tắc định tuyến đã được cấu hình để xác định thành phần nào sẽ nhận thông điệp. Chẳng hạn, thông tin về đơn hàng mới có thể được chuyển đến dịch vụ gửi email hoặc dịch vụ thông báo.

Bước 4: Dịch vụ nhận xử lý thông điệp.

Các dịch vụ nhận thông điệp sẽ thực hiện công việc tương ứng. Dịch vụ email gửi xác nhận đơn hàng, trong khi dịch vụ thông báo có thể gửi thông tin đến nhân viên phụ trách.

Bước 5: Xác nhận hoặc xử lý lỗi.

Tùy vào cơ chế của hệ thống, thành phần nhận có thể xác nhận đã xử lý thông điệp thành công. Nếu gặp lỗi, thông điệp có thể được gửi lại hoặc chuyển sang nơi lưu trữ thông điệp thất bại để kiểm tra.

Thông qua quy trình này, các dịch vụ không nhất thiết phải gọi trực tiếp đến nhau trong từng bước. Message Broker đảm nhận nhiệm vụ tiếp nhận và phân phối thông điệp, còn từng dịch vụ chịu trách nhiệm xử lý nghiệp vụ của mình.

Cần lưu ý rằng cách hoạt động cụ thể phụ thuộc vào từng công nghệ. Một số hệ thống sử dụng hàng đợi để phân phối công việc, trong khi những hệ thống khác hỗ trợ cơ chế xuất bản và đăng ký nhận thông điệp để một sự kiện có thể được gửi đến nhiều thành phần.

4. Producer, Consumer và Message Broker là gì?

Khi tìm hiểu về Message Broker, mình thường gặp ba thuật ngữ quan trọng là Producer, Consumer và Broker. Đây là những thành phần có vai trò khác nhau trong quá trình trao đổi thông điệp.

Producer là thành phần tạo ra và gửi thông điệp. Producer có thể là một ứng dụng, một dịch vụ Backend hoặc một tiến trình cần thông báo về một sự kiện vừa xảy ra.

Ví dụ, khi người dùng đặt hàng thành công, dịch vụ xử lý đơn hàng có thể tạo thông điệp thông báo rằng một đơn hàng mới đã được tạo và gửi thông điệp đó đến Message Broker.

Consumer là thành phần nhận và xử lý thông điệp. Consumer thường đăng ký nhận thông điệp từ một hàng đợi, chủ đề hoặc kênh được cấu hình. Khi nhận được thông điệp, Consumer thực hiện công việc tương ứng với nội dung của thông điệp.

Ví dụ, dịch vụ gửi email có thể đóng vai trò Consumer khi nhận thông điệp về đơn hàng mới và sử dụng thông tin trong đó để gửi email xác nhận cho khách hàng.

Message Broker là thành phần trung gian tiếp nhận và phân phối thông điệp giữa Producer và Consumer. Tùy theo công nghệ, Broker có thể hỗ trợ định tuyến, lưu trữ thông điệp, quản lý hàng đợi và cung cấp cơ chế xác nhận xử lý.

Có thể hình dung quy trình đơn giản là Producer gửi thông điệp, Message Broker tiếp nhận và chuyển thông điệp, còn Consumer nhận thông điệp để thực hiện công việc.

Trong một hệ thống thực tế, một dịch vụ có thể vừa là Producer vừa là Consumer. Chẳng hạn, dịch vụ thanh toán có thể nhận thông điệp về đơn hàng mới, xử lý thanh toán và sau đó tạo ra thông điệp mới để thông báo kết quả cho các dịch vụ khác.

5. Các mô hình giao tiếp thường gặp trong Message Broker

Message Broker có thể hỗ trợ nhiều cách trao đổi thông điệp khác nhau. Trong đó, hai mô hình thường gặp là Point-to-Point và Publish/Subscribe.

5.1. Point-to-Point

Point-to-Point là mô hình giao tiếp sử dụng hàng đợi để chuyển thông điệp đến một Consumer xử lý. Trong cách triển khai phổ biến, mỗi thông điệp trong một hàng đợi được một Consumer xử lý thành công theo cơ chế phân phối của hệ thống, thay vì được gửi cho tất cả Consumer cùng xử lý như những bản sao độc lập.

Ví dụ, một ứng dụng cần tạo hóa đơn cho hàng nghìn đơn hàng. Hệ thống đưa các yêu cầu tạo hóa đơn vào một hàng đợi. Một hoặc nhiều worker cùng nhận công việc từ hàng đợi và xử lý các hóa đơn khác nhau.

Mô hình này phù hợp với những công việc cần được phân phối cho các tiến trình xử lý, chẳng hạn gửi email, tạo báo cáo hoặc xử lý dữ liệu nền.

5.2. Publish/Subscribe

Publish/Subscribe, thường được viết tắt là Pub/Sub, là mô hình cho phép một thành phần phát thông điệp để nhiều thành phần đăng ký nhận có thể tiếp nhận thông tin đó.

Trong mô hình này, thành phần gửi thông điệp được gọi là Publisher, còn các thành phần đăng ký nhận được gọi là Subscriber. Khi có một sự kiện mới, thông điệp có thể được phân phối đến nhiều Subscriber theo cơ chế của hệ thống.

Ví dụ, khi một đơn hàng được tạo thành công, sự kiện đó có thể được sử dụng bởi dịch vụ gửi email, dịch vụ thống kê doanh thu và dịch vụ thông báo cho nhân viên. Mỗi dịch vụ nhận thông tin để thực hiện nhiệm vụ riêng của mình.

Pub/Sub phù hợp với các hệ thống có nhiều thành phần cần phản ứng với cùng một sự kiện. Tuy nhiên, việc có lưu giữ thông điệp để các Subscriber đọc lại hay không còn phụ thuộc vào công nghệ và cách cấu hình.

6. Một số công nghệ Message Broker phổ biến

Message Broker không phải là tên của một sản phẩm duy nhất. Hiện nay có nhiều công nghệ hỗ trợ trao đổi thông điệp, mỗi công nghệ có đặc điểm và cách sử dụng riêng.

RabbitMQ: RabbitMQ là một Message Broker phổ biến, hỗ trợ nhiều mô hình truyền thông điệp. Công nghệ này sử dụng Exchange để tiếp nhận và định tuyến thông điệp đến các Queue theo quy tắc được cấu hình. RabbitMQ thường được sử dụng trong các hệ thống Backend cần xử lý bất đồng bộ, phân phối công việc và giao tiếp giữa các dịch vụ.

Apache Kafka: Apache Kafka là một nền tảng phân phối sự kiện và truyền dữ liệu theo luồng. Kafka lưu các bản ghi trong những Topic được chia thành Partition, cho phép Consumer đọc dữ liệu theo cơ chế của Kafka. Công nghệ này thường được sử dụng để xử lý luồng sự kiện, thu thập log, phân tích dữ liệu và trao đổi dữ liệu giữa nhiều hệ thống.

Redis: Redis chủ yếu được biết đến là một hệ thống lưu trữ dữ liệu trong bộ nhớ, nhưng cũng cung cấp các cơ chế truyền thông điệp như Pub/Sub và Redis Streams. Ngoài ra, Redis thường được sử dụng làm nền tảng cho những thư viện hàng đợi xử lý công việc. Tuy nhiên, không nên xem mọi cách sử dụng Redis đều tương đương với một Message Broker chuyên dụng.

Amazon SQS: Amazon Simple Queue Service là dịch vụ hàng đợi được cung cấp trên AWS. Dịch vụ này giúp các thành phần trong ứng dụng gửi và nhận thông điệp mà không cần tự triển khai toàn bộ hạ tầng hàng đợi. Amazon SQS thường được sử dụng trong các ứng dụng chạy trên nền tảng đám mây.

Apache ActiveMQ: ActiveMQ là một hệ thống nhắn tin hỗ trợ giao tiếp giữa các ứng dụng thông qua những giao thức và mô hình nhắn tin khác nhau. Công nghệ này có thể được sử dụng trong các hệ thống cần truyền thông điệp giữa những thành phần được phát triển bằng các công nghệ khác nhau.

Khi lựa chọn công nghệ, lập trình viên cần xem xét yêu cầu của dự án, mô hình giao tiếp, số lượng thông điệp, khả năng lưu trữ, độ tin cậy, cách triển khai và kinh nghiệm của nhóm phát triển. Không có một công nghệ nào phù hợp nhất cho tất cả các trường hợp.

7. Message Broker liên quan như thế nào đến Background Jobs & Queues?

Trong quá trình tìm hiểu về Backend Development, mình nhận thấy Message Broker, Background Jobs và Queues thường được nhắc đến cùng nhau vì chúng có thể phối hợp để thực hiện các công việc bất đồng bộ.

Background Job là công việc được thực hiện ở phía sau, chẳng hạn gửi email, xử lý hình ảnh hoặc tạo báo cáo.

Queue là hàng đợi dùng để lưu hoặc quản lý các công việc đang chờ được xử lý.

Message Broker là thành phần trung gian giúp tiếp nhận, định tuyến và phân phối thông điệp giữa những thành phần trong hệ thống. Trong nhiều kiến trúc, Message Broker cung cấp hoặc quản lý các hàng đợi được sử dụng để phân phối công việc.

Ví dụ, trong một ứng dụng bán hàng, khi người dùng đặt hàng thành công, ứng dụng tạo một Background Job để gửi email xác nhận. Công việc này được đưa vào Queue thông qua hệ thống hàng đợi. Worker sau đó nhận job và thực hiện gửi email.

Trong trường hợp này, Background Job mô tả công việc cần thực hiện, Queue quản lý công việc đang chờ, còn Message Broker có thể đảm nhiệm việc tiếp nhận và phân phối thông điệp phục vụ quá trình xử lý đó.

Tuy nhiên, không phải mọi hệ thống Background Jobs đều bắt buộc phải có một Message Broker riêng. Một số framework có thể sử dụng cơ sở dữ liệu làm nơi lưu hàng đợi, trong khi những hệ thống khác sử dụng Redis, RabbitMQ hoặc một dịch vụ hàng đợi trên nền tảng đám mây.

Việc hiểu mối liên hệ giữa những khái niệm này giúp lập trình viên biết được từng thành phần đảm nhận nhiệm vụ gì và cách chúng phối hợp để xây dựng một ứng dụng có khả năng xử lý công việc hiệu quả hơn.

8. Những lưu ý khi sử dụng Message Broker

Mặc dù Message Broker giúp hệ thống linh hoạt hơn, việc triển khai vẫn cần được thiết kế cẩn thận để hạn chế các vấn đề liên quan đến dữ liệu và khả năng vận hành.

Thứ nhất, cần xác định rõ nội dung thông điệp. Thông điệp nên chứa những dữ liệu cần thiết để Consumer xử lý công việc. Cấu trúc thông điệp cần được thống nhất để hạn chế lỗi khi các dịch vụ sử dụng những phiên bản dữ liệu khác nhau.

Thứ hai, cần xử lý trường hợp thông điệp bị gửi hoặc xử lý nhiều lần. Một số cơ chế truyền thông điệp có thể dẫn đến việc Consumer nhận lại thông điệp khi xảy ra lỗi hoặc khi hệ thống chưa ghi nhận được xác nhận xử lý. Vì vậy, những nghiệp vụ quan trọng nên có cơ chế chống xử lý trùng lặp phù hợp.

Thứ ba, cần có cơ chế xử lý lỗi. Nếu Consumer không thể xử lý thông điệp, hệ thống cần có chính sách phù hợp như thử lại, ghi nhận lỗi hoặc chuyển thông điệp sang hàng đợi dành cho thông điệp thất bại. Việc thử lại cần được giới hạn hợp lý để tránh lặp vô hạn.

Thứ tư, cần theo dõi lượng thông điệp đang chờ. Nếu tốc độ tạo thông điệp lớn hơn tốc độ xử lý, hàng đợi có thể ngày càng dài. Lập trình viên cần giám sát độ dài hàng đợi, thời gian chờ và năng lực của Consumer để phát hiện tình trạng quá tải.

Thứ năm, cần chú ý đến bảo mật. Thông điệp có thể chứa thông tin khách hàng, dữ liệu đơn hàng hoặc những thông tin nội bộ của hệ thống. Do đó, cần kiểm soát quyền truy cập, bảo vệ kết nối và tránh đưa dữ liệu nhạy cảm không cần thiết vào nội dung thông điệp.

Thứ sáu, cần cân nhắc tính nhất quán của dữ liệu. Khi nhiều dịch vụ xử lý thông điệp bất đồng bộ, các thành phần có thể cập nhật dữ liệu ở những thời điểm khác nhau. Vì vậy, ứng dụng cần xác định rõ trạng thái nào được xem là hoàn thành và cách xử lý khi một dịch vụ chưa cập nhật kịp thời.

Thứ bảy, cần theo dõi tình trạng của Message Broker. Nếu Broker ngừng hoạt động hoặc không thể tiếp nhận thông điệp, quá trình giao tiếp giữa các thành phần có thể bị gián đoạn. Tùy theo yêu cầu của hệ thống, cần xem xét khả năng dự phòng, sao lưu hoặc phục hồi và các cơ chế bảo đảm thông điệp không bị mất ngoài dự kiến.

Những lưu ý này cho thấy Message Broker không chỉ đơn giản là một công cụ truyền thông điệp mà còn là một thành phần cần được quản lý về độ tin cậy, hiệu suất và bảo mật trong kiến trúc phần mềm.

Kết luận

Message Broker là một thành phần quan trọng trong nhiều hệ thống phần mềm hiện đại, giúp các ứng dụng và dịch vụ trao đổi thông điệp thông qua một cơ chế trung gian. Thay vì phụ thuộc hoàn toàn vào việc gọi trực tiếp giữa các thành phần, hệ thống có thể sử dụng Message Broker để tiếp nhận, định tuyến và phân phối thông điệp theo những quy tắc đã được thiết lập.

Qua quá trình tìm hiểu, mình hiểu rằng Message Broker đặc biệt hữu ích khi xây dựng các hệ thống cần xử lý bất đồng bộ, giao tiếp giữa nhiều dịch vụ hoặc phân phối số lượng lớn công việc. Những công nghệ như RabbitMQ, Apache Kafka, Redis và Amazon SQS đều có thể hỗ trợ các nhu cầu trao đổi thông điệp, nhưng mỗi công nghệ có cách hoạt động và phạm vi sử dụng riêng.

Đối với sinh viên IT, nắm được khái niệm Message Broker là nền tảng để tiếp tục tìm hiểu về Backend Development, Microservices, Event-Driven Architecture và các hệ thống phân tán. Quan trọng hơn, cần hiểu rõ cách thông điệp được tạo ra, truyền đi, tiếp nhận và xử lý lỗi để có thể áp dụng kiến thức này vào những dự án thực tế.

Bài viết khác

Background Jobs and Queues

1. Background Jobs and Queues là gì? Background Jobs & Queues là hai khái niệm thường gặp trong quá trình phát triển phần mềm, đặc biệt là khi xây dựng các ứng dụng web, ứng dụng di động hoặc những hệ thống cần xử lý nhiều yêu cầu cùng lúc. Hai khái niệm này liên […]

Redis and Caching

1. Caching là gì? Caching là kỹ thuật lưu trữ tạm thời những dữ liệu thường xuyên được sử dụng để có thể truy xuất lại nhanh chóng khi cần thiết. Thay vì mỗi lần người dùng thực hiện một thao tác, hệ thống đều phải truy vấn cơ sở dữ liệu hoặc xử lý […]

Database Migration

1. Database Migration là gì? Database Migration là quá trình quản lý và cập nhật cấu trúc cơ sở dữ liệu theo từng phiên bản trong quá trình phát triển phần mềm. Khi xây dựng một ứng dụng, cơ sở dữ liệu thường xuyên thay đổi để đáp ứng các yêu cầu mới. Ví dụ, […]

Bun ORM

1. Bun ORM là gì? Bun ORM là một thư viện ORM dành cho ngôn ngữ lập trình Go (Golang), được sử dụng để làm việc với cơ sở dữ liệu quan hệ. Bun giúp lập trình viên xây dựng và thực hiện các truy vấn database thông qua những cấu trúc dữ liệu và […]

Date / Number / Currency Formatting

       Trong quá trình phát triển phần mềm, đặc biệt là các ứng dụng web và di động phục vụ người dùng ở nhiều quốc gia, việc hiển thị dữ liệu theo đúng định dạng ngày tháng, số và tiền tệ đóng vai trò vô cùng quan trọng. Người dùng không chỉ quan […]

Localization (L10n)

        Trong thời đại toàn cầu hóa, sự phát triển mạnh mẽ của công nghệ thông tin và thương mại điện tử đã tạo điều kiện để sản phẩm, dịch vụ và nội dung có thể tiếp cận người dùng ở nhiều quốc gia khác nhau. Tuy nhiên, việc đưa một sản […]

Leave a Reply

Your email address will not be published. Required fields are marked *