- 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.
Câu hỏi chính của em là việc cấu hình đa luồng như vậy thì em thấy ưu điểm trước mắt là như trên thì bênh cạnh đó thì nó có nhượ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 )
Và ví dụ topic có nhiều partition hơn thì mình set concurrency bằng 1 số tương ứng thì có ảnh hưởng gì đến hiệu năng ko và có chuyện gì sẽ xảy ra khi mình set số lượng luồng quá 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