Giới thiệu
Trong những ngày đầu của microservices, REST APIs đã trở thành cách mặc định để các dịch vụ giao tiếp với nhau. Chúng đơn giản, dễ hiểu và được chấp nhận rộng rãi. Tuy nhiên, khi hệ thống phát triển, REST bắt đầu bộc lộ những điểm yếu như độ trễ, nghẽn cổ chai và phụ thuộc dễ vỡ. Đó là lý do tại sao giao tiếp bất đồng bộ với các công cụ như Kafka, RabbitMQ, hoặc Azure Service Bus ngày càng trở nên phổ biến hơn.
Mục lục
- Tính liên kết lỏng lẻo vs. liên kết chặt chẽ
- Chế độ đẩy vs. chế độ kéo: Kiểm soát quan trọng
- Khả năng mở rộng là cốt lõi
- Độ tin cậy tích hợp sẵn
- Sức mạnh dựa trên sự kiện
- Độ linh hoạt bền vững
- Những điểm đáng chú ý: Tại sao Bất đồng bộ không phải lúc nào cũng tốt hơn
- Kết luận
🔹 Tính liên kết lỏng lẻo vs. liên kết chặt chẽ
- REST APIs yêu cầu một mối quan hệ yêu cầu - phản hồi. Nếu Dịch vụ A gọi Dịch vụ B, A phải chờ cho đến khi B trả lời.
- Giao tiếp bất đồng bộ đảo ngược điều này. A chỉ cần gửi một thông điệp và tiếp tục. B (và thậm chí C, D, E…) có thể tiêu thụ thông điệp khi sẵn sàng.
👉 Việc phân tách này làm cho hệ thống trở nên đáng tin cậy hơn—một dịch vụ chậm không làm hỏng toàn bộ chuỗi.
🔹 Chế độ đẩy vs. chế độ kéo: Kiểm soát quan trọng
- Với REST APIs, nhà sản xuất ở chế độ đẩy. Người gọi phải truy cập trực tiếp vào máy chủ, không quan tâm đến việc máy chủ có bận, quá tải hoặc tạm thời không hoạt động. Điều này tạo áp lực và phụ thuộc vào khả năng của người tiêu dùng.
- Với giao tiếp bất đồng bộ, người tiêu dùng hoạt động ở chế độ kéo. Họ lấy và xử lý các sự kiện theo tốc độ của chính họ. Nếu một người tiêu dùng chậm lại, broker sẽ an toàn lưu trữ thông điệp cho đến khi họ kịp bắt kịp.
👉 Sự khác biệt này làm cho hệ thống bất đồng bộ trở nên tự nhiên đàn hồi. Các dịch vụ hoạt động với tốc độ tối đa của chúng—không nhiều hơn, không ít hơn.
🔹 Khả năng mở rộng là cốt lõi
- REST yêu cầu mỗi yêu cầu phải truy cập trực tiếp vào máy chủ, điều này có nghĩa là khả năng mở rộng theo chiều ngang (cân bằng tải, bản sao).
- Kafka có thể xử lý hàng triệu sự kiện mỗi giây theo thiết kế. Nhiều người tiêu dùng có thể xử lý cùng một chủ đề song song, cho phép mở rộng lớn mà không làm nghẽn các dịch vụ phía trên.
👉 Bất đồng bộ tỏa sáng khi tải tăng vọt—như trong các đợt bán hàng flash hoặc dòng dữ liệu thời gian thực.
🔹 Độ tin cậy tích hợp sẵn
- Nếu một điểm cuối REST không hoạt động, các yêu cầu sẽ thất bại trừ khi bạn xây dựng logic thử lại.
- Với giao tiếp bất đồng bộ, các sự kiện được lưu trữ bền vững trong broker. Ngay cả khi người tiêu dùng ngoại tuyến, họ vẫn có thể bắt kịp sau này.
👉 Điều này là một chiến thắng lớn cho các hệ thống quan trọng, nơi mất sự kiện = mất tiền.
🔹 Sức mạnh dựa trên sự kiện
REST chủ yếu xoay quanh hỏi:
“Tình trạng hiện tại của bạn là gì?”
Giao tiếp là về thông báo:
“Sự kiện này đã xảy ra.”
Sự khác biệt nhỏ đó mở khóa kiến trúc dựa trên sự kiện, nơi các hệ thống tự động phản ứng với sự thay đổi. Ví dụ:
- Đơn hàng được tạo → Tồn kho được giữ → Thông báo được gửi
- Thanh toán thành công → Điểm thưởng được cấp → Email được kích hoạt
👉 Dòng chảy này tự nhiên, có thể mở rộng và giảm thiểu sự cần thiết phải truy vấn liên tục.
🔹 Độ linh hoạt bền vững
Với REST, nếu bạn thêm một người tiêu dùng mới, bạn phải cập nhật nhà sản xuất để gọi nó.
Với giao tiếp bất đồng bộ, các nhà sản xuất không quan tâm đến việc ai đang lắng nghe. Bạn có thể thêm các người tiêu dùng mới (phân tích, giám sát, phát hiện gian lận) mà không cần chạm vào các dịch vụ hiện tại.
👉 Đây là cách mà các công ty phát triển từ MVP đến quy mô doanh nghiệp mà không cần viết lại mọi thứ.
⚖️ Những điểm đáng chú ý: Tại sao Bất đồng bộ không phải lúc nào cũng tốt hơn
Mặc dù giao tiếp bất đồng bộ rất mạnh mẽ, nhưng nó không phải là giải pháp hoàn hảo:
- Độ phức tạp: Thiết kế một hệ thống dựa trên sự kiện yêu cầu có kế hoạch cẩn thận (các lược đồ thông điệp, idempotency, thứ tự).
- Tính nhất quán cuối cùng: Bạn không thể luôn nhận được câu trả lời ngay lập tức. Người dùng có thể thấy một chút độ trễ trước khi dữ liệu đồng bộ hoàn toàn.
- Chi phí vận hành: Các broker như Kafka yêu cầu hạ tầng, giám sát và chiến lược mở rộng. REST, ngược lại, có thể chạy ở hầu hết mọi nơi với thiết lập tối thiểu.
👉 Đối với các tính năng hướng người dùng cần xác nhận ngay lập tức (đăng nhập, thanh toán, tìm kiếm), REST vẫn là lựa chọn tốt hơn. Giao tiếp bất đồng bộ tỏa sáng ở phía sau nơi mà quy mô, độ tin cậy và sự phân tách là quan trọng nhất.
🚀 Kết luận
Nếu bạn đang xây dựng cho quy mô, độ tin cậy và sự phát triển, REST đơn thuần sẽ không đủ. Giao tiếp bất đồng bộ không chỉ là một công cụ mà còn là một tư duy kiến trúc chấp nhận sự phân tách, độ tin cậy và phát triển.
Tương lai là dựa trên sự kiện. Và giao tiếp làm cho điều đó trở nên khả thi.