Zkafka by Zillow: Go Library for Simplifying Kafka Consumption
Bài tóm tắt Zillow 2024 3. Quy mô lớn Độ khó: Khó
Zillow · 2024 · 3. Quy mô lớn · Độ khó: Khó — bài gốc
Bối cảnh
- Năm năm qua Kafka dùng rộng ở Zillow: cụm nội bộ hơn 1.500 topic (2024). Team Java có Flink và nhiều framework; team Go, Python, JS tự viết consumer.
- Consumer tự viết: dùng compute kém (xử lý từng message một, scale chỉ bằng thêm replica nhưng mỗi partition chỉ một consumer), không có telemetry, tắt chưa gọn, đảm bảo at-least-once yếu, không có dead letter hay retry pipeline. Một message chậm (poison pill) chặn cả partition (head-of-line blocking).
Thay đổi chính
- zkafka: thư viện Go mã nguồn mở, khoảng 100 service dùng; dev chỉ viết hàm xử lý một message.
- Work-ahead: xử lý song song nhiều message của cùng partition, đánh dấu từng message xong, và chỉ commit offset khi mọi message trước đó đã xong (commit logic cục bộ, đẩy lên broker định kỳ và lúc rebalance), tránh mất dữ liệu khi replica chết giữa chừng.
- Virtual partitions: một goroutine router chia message vào pool goroutine theo hash của key mod N, nên message cùng key vẫn tuần tự còn khác key chạy song song; vượt giới hạn số partition vật lý mà không phá thứ tự theo key. Goroutine (khoảng 2 KB) rẻ hơn nhiều so với một replica (khoảng 40 MiB) trên Kubernetes.
- Dead letter bằng cấu hình (tên topic); retry pipeline gồm nhiều worker cùng hàm xử lý, khác topic nguồn, topic dead letter và độ trễ xử lý; mỗi message có giới hạn thời gian (mặc định 1 phút) để luôn tiến được.
- Chọn thư viện thay vì service proxy như Uber Consumer Proxy, theo Zillow vì: service tốn công làm và vận hành lâu dài (cô lập workload, scale), khó chứng minh đúng, thêm thành phần vào kịch bản lỗi, cần tầng lưu trạng thái riêng (commit âm cho message dead letter, message đang bay), thêm hop mạng.
Vì sao
- Kafka mạnh nhưng nhiều khái niệm (consumer group, rebalance, offset, commit); một thư viện chuẩn gói các lựa chọn đúng mặc định để team không phải tự quyết (Nền tảng nội bộ cho service (đường ray chung), Event-driven, message queue và Kafka).
Bài học cho SWE
- Xử lý song song trong một partition chỉ an toàn nếu commit theo "vạch nước thấp" của các message đã xong.
- Song song theo key giữ được thứ tự cần thiết và cô lập poison pill.
- Thư viện hay service trung gian: thư viện đơn giản hơn để đúng, service tập trung kiểm soát hơn nhưng thêm một hệ phân tán phải vận hành.
Liên quan
#zkafka#Go Kafka consumer library#1#500+ topics#work-ahead processing#in-order commit tracking#virtual partitions (key hash)#head-of-line blocking#dead letter topic#retry pipeline with processor delay#library vs consumer proxy service
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (1)