Giao tiếp đồng bộ và bất đồng bộ giữa các dịch vụ
Đáp án mẫu
Giao tiếp đồng bộ, như HTTP/REST hoặc gRPC, nghĩa là bên gọi gửi yêu cầu và chờ phản hồi. Nó dễ suy luận, cho kết quả ngay, và hợp với truy vấn và các thao tác mà người dùng cần câu trả lời ngay. Nhược điểm là ràng buộc về thời gian: nếu bên được gọi chậm hoặc ngừng hoạt động thì bên gọi bị ảnh hưởng, và lỗi có thể lan dây chuyền qua chuỗi lời gọi. Timeout, retry và circuit breaker giúp giảm tác động.
Giao tiếp bất đồng bộ, như nhắn tin qua hàng đợi hoặc event broker, nghĩa là bên gửi phát một thông điệp rồi làm tiếp. Bên nhận xử lý sau. Điều này tách các dịch vụ về mặt thời gian, hấp thụ các đợt tăng tải, cho phép bên tiêu thụ mở rộng độc lập, và cho phép nhiều bên tiêu thụ một sự kiện. Cái giá là nhất quán cuối cùng, khó gỡ lỗi và truy vết hơn, các vấn đề về thứ tự và giao trùng lặp đòi hỏi bên tiêu thụ idempotent, và phải vận hành một broker.
Dùng đồng bộ cho nhu cầu yêu cầu/phản hồi và bất đồng bộ cho các quy trình có thể hoàn tất sau, như gửi email hoặc cập nhật chỉ mục tìm kiếm.
Ý chính
- Đồng bộ: đơn giản và có kết quả ngay, nhưng ràng buộc tính sẵn sàng và độ trễ
- Bất đồng bộ: tách theo thời gian và hấp thụ tăng tải, nhưng thêm nhất quán cuối cùng
- Bên tiêu thụ bất đồng bộ phải xử lý trùng lặp và thứ tự
Câu hỏi nối tiếp thường gặp
- Bạn phản hồi cho người dùng thế nào với thao tác hoàn tất bất đồng bộ?
- Circuit breaker là gì và khi nào nó hữu ích?
Lỗi thường gặp
- Xây chuỗi dài các lời gọi đồng bộ mà không có timeout hay phương án dự phòng
- Dùng nhắn tin bất đồng bộ mà bên tiêu thụ không idempotent