Giới thiệu
Trong phát triển phần mềm, đặc biệt là khi làm việc với microservices, vấn đề bảo mật và cách tổ chức các topic Kafka là rất quan trọng. Bài viết này sẽ chia sẻ những bài học mà chúng tôi đã đúc kết từ việc sử dụng CompletableFuture trong Spring Boot và cách quản lý các consumer Kafka.
Vấn đề 1: CompletableFuture + Thiếu Bối Cảnh Bảo Mật = 401 Unauthorized
Khi chúng tôi bắt đầu sử dụng CompletableFuture.supplyAsync() trong microservice Spring Boot của mình, một số gọi đến các dịch vụ khác (thông qua Feign client) bắt đầu thất bại với lỗi 401 Unauthorized.
Nguyên nhân:
CompletableFuturechạy trong một luồng riêng biệt.- Theo mặc định, bối cảnh bảo mật Spring (và token JWT) không được truyền tải đến luồng mới đó.
- Do đó, interceptor Feign của chúng tôi không thể đính kèm header
Authorization, và dịch vụ phía dưới đã từ chối yêu cầu.
Giải pháp: Chúng tôi đã bao bọc executor của mình bằng DelegatingSecurityContextExecutorService để bối cảnh bảo mật (bao gồm token JWT) được truyền theo các tác vụ bất đồng bộ. Sau khi thay đổi này, token đã được thêm chính xác và lỗi 401 đã biến mất.
Vấn đề 2: Consumer Kafka và Group ID
Chúng tôi cũng gặp phải một vấn đề với consumer Kafka. Ban đầu, chúng tôi đã sử dụng cùng một group ID cho nhiều topic. Điều này gây ra hành vi không mong đợi:
- Các consumer trong cùng một nhóm chia sẻ tin nhắn.
- Với một group ID duy nhất, tin nhắn từ các topic khác nhau bị “cạnh tranh” bởi cùng một nhóm, dẫn đến việc tiêu thụ bị bỏ lỡ hoặc không cân bằng.
Giải pháp: Chúng tôi đã chỉ định cho mỗi topic một group ID duy nhất. Bằng cách này, mỗi topic được tiêu thụ độc lập và không có tin nhắn nào bị bỏ qua.
Thực hành tốt nhất
- Đối với mã bất đồng bộ trong Spring Security: luôn đảm bảo bối cảnh bảo mật được truyền tải.
- Đối với Kafka: hãy suy nghĩ cẩn thận về group ID — cùng một nhóm = cân bằng tải, các nhóm khác nhau = tiêu thụ độc lập.
Những cạm bẫy thường gặp
- Không kiểm tra kỹ bối cảnh bảo mật khi sử dụng
CompletableFuturecó thể dẫn đến lỗi bảo mật. - Sử dụng cùng một group ID cho nhiều topic có thể làm giảm hiệu suất của hệ thống.
Mẹo hiệu suất
- Sử dụng
CompletableFuturecho các tác vụ bất đồng bộ nhưng đảm bảo bối cảnh bảo mật được duy trì. - Tối ưu hóa việc sử dụng group ID cho Kafka để cải thiện tốc độ tiêu thụ.
Giải quyết sự cố
- Nếu bạn gặp lỗi 401 Unauthorized, hãy kiểm tra xem bối cảnh bảo mật có được thiết lập đúng không.
- Nếu tin nhắn bị bỏ lỡ trong Kafka, hãy kiểm tra cấu hình group ID của các consumer.
Kết luận
Việc hiểu rõ cách hoạt động của CompletableFuture và cách tổ chức các group ID trong Kafka là rất quan trọng để xây dựng một microservice an toàn và hiệu quả. Hy vọng những bài học này sẽ giúp ích cho bạn trong quá trình phát triển phần mềm. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại ý kiến của bạn bên dưới!
Câu hỏi thường gặp (FAQ)
- CompletableFuture là gì?
CompletableFuturelà một lớp trong Java giúp thực hiện các tác vụ bất đồng bộ một cách dễ dàng. - Tại sao cần phải truyền bối cảnh bảo mật?
Truyền bối cảnh bảo mật giúp đảm bảo rằng các yêu cầu đến dịch vụ bên ngoài được xác thực chính xác. - Cách tối ưu hóa tiêu thụ tin nhắn trong Kafka?
Sử dụng group ID riêng cho từng topic để đảm bảo không có tin nhắn nào bị bỏ lỡ.