- Em dùng @KafkaListener để nhận message từ 1 topic.
- Sau khi nhận message từ Kafka thì sẽ xử lý 1 tác vụ rất lâu mà em muốn cải thiện hiệu năng em mới quyết định config đa luồng cho hàm listener này bằng thuộc tính concurrency = 2 (tương ứng với 2 luồng xử lí => mỗi luồng sẽ đc giao 1 partition , topic ví dụ của em có 2 partition )
Hỏi về đa luồng khi làm việc với Kafka Consumer
Chào mọi người,
Hiện tại thì em mới tìm hiểu về Kafka gần đây nên kiến thức về Kafka và cả kiến thức đa luồng trong Java của em chỉ ở mức cơ bản thôi ạ.
Em có một câu hỏi muốn hỏi anh Dũng và mọi người là:
Việc config như vậy sẽ cải thiện đc vấn đề hiệu năng một tí , vì có thể xử lý 2 message cùng 1 lúc không cần đợi nhau.
chínhnhược điểm gì không ạ ?( Vì kiến thức em còn hạn hẹp quá nên chưa thể nhìn ra )
concurrency lớn ạ ?
Cảm ơn mọi người !
kafka
spring
Remain: 5
2 Answers
Nguyễn Thái Sơn
Professional
Nguyễn Thái Sơn
Professional
Em có thể share source code không, nếu làm 2 luồng anh e là không ổn vì số thread hữu hạn thôi, k đủ để làm
-
-1
tvd12
Enlightened
tvd12
Enlightened
- Đầu tiên em phải hiểu cách mà Spring nó lấy record từ kafka như thế nào đã, em hãy <a href="https://github.com/spring-projects/spring-kafka/blob/main/spring-kafka/src/main/java/org/springframework/kafka/core/KafkaTemplate.java#L605" target="_blank" rel="noopener nofollow ugc">nhìn vào KafkaTemplate</a> em sẽ thấy mỗi 1 lần gọi receive nó sẽ lấy ra 1 record để xử lý
- Tiếp theo cái <code>spring.kafka.listener.concurrency=10</code> nó sẽ tác động vào <a href="https://github.com/spring-projects/spring-kafka/blob/main/spring-kafka/src/main/java/org/springframework/kafka/listener/ConcurrentMessageListenerContainer.java#L202" target="_blank" rel="noopener nofollow ugc">ConcurrentMessageListenerContainer</a>
- Và cuối cùng là nó sẽ tác động vào lớp <a href="https://github.com/spring-projects/spring-kafka/blob/main/spring-kafka/src/main/java/org/springframework/kafka/listener/KafkaMessageListenerContainer.java#L352" target="_blank" rel="noopener nofollow ugc">KafkaMessageListenerContainer</a>
Như vậy sẽ trả lời cho 2 câu hỏi của em như sau:
- Việc em tăng số lượng luồng thì sẽ lấy ra nhiều message khỏi kafka hơn. Từ đó mà sẽ có nhiều message được xử lý đồng thời hơn, và điều này là tốt nên không có nhược điểm gì em ạ, trừ khi dữ liệu của em ở các topic cần phải xử lý tuần tự thì nhược điểm là em sẽ phải code phức tạp để đảm để đảm bảo việc xử lý theo đứng thứ tự
- Cái này tuỳ vào tốc độ xử lý ở lớp listener của em, nếu nó xử lý nhanh thì không vấn đề gì, nhưng nếu mỗi topic lại xử lý khác nhau thì việc sử dụng số luồng tương ứng với số topic sẽ cho hiệu năng tốt hơn. Mỗi luồng trong java sẽ chiếm khoảng 2MB nên em tạo ra nhiều luồng sẽ tốn RAM, nên anh nghĩ em nên set số luồng = số topic là ổn em ạ.
-
1