Avatar
1
Hihi Teacher
Hihi Teacher
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à:

  1. Em dùng @KafkaListener để nhận message từ 1 topic.
  2. 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 )

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 !

 

  • Answer
kafka spring
Remain: 5
2 Answers
Avatar
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
  • Reply

Dạ cái ở trên là em làm ví dụ thôi ạ.Tại em đang trong quá trình tự học Kafka vs đa luồng nên có 1 số thắc mắc mà em nghĩ phải một người làm thực tế rồi mới có thể có câu trả lời ạ.Hai điều em thắc mắc chính của em là :

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à là xử lí nhanh hơn thì bên cạnh đó thì nó có nhược điểm gì không ạ ? Điểm hạn chế của đa luồng so với đơn luồng ( vì em nghĩ ko có gì là tốt 100% cả )

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 ạ ?

 –  Hihi 1647129441000
Avatar
tvd12 Teacher
tvd12 Teacher
The Best Answer
  1. Đầ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 nhìn vào KafkaTemplate em sẽ thấy mỗi 1 lần gọi receive nó sẽ lấy ra 1 record để xử lý
  2. Tiếp theo cái spring.kafka.listener.concurrency=10 nó sẽ tác động vào ConcurrentMessageListenerContainer
  3. Và cuối cùng là nó sẽ tác động vào lớp KafkaMessageListenerContainer

Như vậy sẽ trả lời cho 2 câu hỏi của em như sau:

  1. 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ự
  2. 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
  • Reply
E thấy ở trên a có nhắc đến các topic và a có ghi là set số luồng = số topic.Trường hợp của e là chỉ có 1 topic thôi ạ.Hay "Topic" là a nói là số Partition của 1 topic đúng không ạ ?  –  Hihi 1647156668000
Cái này thì còn tuỳ vào logic của em, nhưng thường dữ liệu trong 1 topic sẽ có 1 mức độ liên quan nhất định với nhau. Nên tốt nhất là 1 topic chỉ nên có thread (dù có nhiều partition). Còn việc em có thể sử dụng đa luồng ở trong lớp Listener nếu cần thay vì đẩy trách nhiệm cho kafka em ạ.  –  tvd12 1647156850000