1. Mở Đầu
Trong thiết kế kiến trúc hệ thống, thời gian giao nhận tin nhắn (Message Delivery Time) là yếu tố cực kỳ quan trọng mà các kỹ sư cần xem xét. Các công nghệ như Kafka, Redis, Hazelcast, hay Oracle Database đều có những tham số ảnh hưởng trực tiếp đến thời gian này. Hiểu rõ và sử dụng tốt các tham số này sẽ giúp chúng ta tùy chỉnh và tối ưu ứng dụng của mình một cách linh hoạt hơn. Bài viết này sẽ điểm qua các tham số quan trọng trong Kafka và chia sẻ một số tình huống thực tiễn mà mình đã áp dụng để cải thiện hiệu suất cho ứng dụng của mình.
2. Các Tham Số Quan Trọng Ảnh Hưởng Đến Thời Gian Giao Nhận Tin Nhắn
delivery.timeout.ms
Tham số này giới hạn thời gian từ khi một bản ghi (record) đã sẵn sàng để gửi cho đến khi broker phản hồi hoặc client từ bỏ. Thời gian này cần lớn hơn tham số linger.ms
và request.timeout.ms
; nếu không, sẽ phát sinh lỗi. Khi producer vượt quá thời gian này trong quá trình gửi lại, callback sẽ nhận được exception tương ứng với lỗi từ broker.
max.block.ms
Tham số này kiểm soát thời gian tối đa mà producer có thể bị chặn khi gọi phương thức send() và yêu cầu dữ liệu metadata thông qua partitionsFor(). Nếu vượt quá thời gian này, sẽ truyền ra ngoại lệ timeout.
linger.ms
Tham số này điều chỉnh thời gian mà producer sẽ chờ để thêm tin nhắn vào batch hiện tại trước khi gửi. Nếu thiết lập linger.ms
lớn hơn 0, producer sẽ chờ để thêm các thông điệp trước khi gửi, làm tăng độ trễ nhưng cải thiện đáng kể hiệu suất và thông lượng.
request.timeout.ms
Tham số này sử dụng để xác định thời gian mà producer sẽ chờ đợi phản hồi từ server. Nếu không nhận được phản hồi trong thời gian quy định, producer sẽ thử gửi lại hoặc hoàn tất callback với một TimeoutException.
retry.backoff.ms
Khi producer gặp lỗi từ server, lỗi có thể mang tính tạm thời. Tham số này quy định thời gian chờ giữa các lần thử gửi lại. Mình khuyến nghị không sử dụng tham số này một cách tùy tiện mà nên kiểm tra thời gian khôi phục từ lỗi của broker và điều chỉnh delivery.timeout.ms
cho hợp lý.
3. Kết Luận
Việc tùy chỉnh các tham số cấu hình này rất quan trọng để tối ưu hóa thời gian gửi tin nhắn trong Kafka. Cần cân bằng giữa độ trễ và hiệu suất gửi tin nhắn sao cho phù hợp với yêu cầu của ứng dụng. Việc theo dõi và điều chỉnh những tham số này theo yêu cầu thực tế giúp giảm thiểu thời gian chờ đợi và nâng cao hiệu suất tổng thể.
Một số tình huống mình đã áp dụng:
- Điều chỉnh tham số
acks
cho Kafka server phản hồi nhanh chóng, mình thường sử dụng cấu hìnhacks=1
. - Tăng giá trị
linger.ms
từ 10ms lên 100ms để đo thước đo throughput đến Kafka, từ đó kiểm chứng hiệu quả.
4. Thông Tin Kết Nối
Nếu bạn mong muốn trao đổi thêm về bài viết này, hãy kết nối với mình qua LinkedIn và Facebook:
Rất mong được kết nối và cùng thảo luận!
source: viblo