Cập nhật_2024-11-13
- Báo cáo ban đầu cho rằng khi bật auto-commit, consumer có thể tự động commit offset được trả về từ lần poll gần nhất, dẫn đến mất dữ liệu.
- Tuy nhiên, nhiều độc giả phản biện rằng trên thực tế consumer auto-commit sẽ commit offset của lần poll trước đó, chứ không phải lần poll gần nhất.
- Kết quả thử nghiệm với Java Kafka client cũng ủng hộ nhận định này, và hành vi có thể khác nhau tùy từng client.
- Các khẳng định cụ thể về auto-commit đã được gỡ khỏi báo cáo, và cần thêm nghiên cứu.
Bối cảnh
- Kafka là một hệ thống streaming phổ biến, cung cấp replication, sharding và append-only log.
- Bufstream là một giải pháp thay thế cho Kafka, ưu tiên quản trị dữ liệu và hiệu quả chi phí trong môi trường đám mây.
- Tương tự Kafka, Bufstream cung cấp tập hợp các log được sắp xếp một phần gọi là topic, và mỗi topic được chia thành các partition.
- Bufstream tương thích với các Kafka client tiêu chuẩn, và được cấu thành từ agent — dịch vụ stateless cung cấp Kafka API, object store lưu trữ dữ liệu, và dịch vụ điều phối.
- Bufstream giảm chi phí bằng cách ghi trực tiếp dữ liệu vào các dịch vụ object storage, và có thể vận hành trên các VM stateless, tự động mở rộng.
Độ an toàn phía client
- Bufstream được thiết kế cho nhiều ứng dụng streaming khác nhau và thiết lập nhiều tùy chọn cấu hình client để đảm bảo vận hành an toàn.
- Giống Kafka, hệ thống dùng mặc định
acks = all và đặt enable.auto.commit = false để ngăn mất dữ liệu.
- Sử dụng
auto.offset.reset = earliest để consumer có thể quan sát toàn bộ log.
Giao dịch
- Bufstream hỗ trợ hệ thống giao dịch của Kafka, cung cấp một dạng atomicity yếu thông qua cấu hình phức tạp.
- Consumer có thể chạy ở mức cô lập
read_uncommitted hoặc read_committed, trong đó read_committed ngăn một số hiện tượng (G1a, G1c).
- G0 vẫn xảy ra trên Kafka, Redpanda và Bufstream, điều này không khớp với mức cô lập được tài liệu hóa.
Thiết kế kiểm thử
- Đã kiểm thử từ Bufstream 0.1.0 đến 0.1.3 bằng thư viện kiểm thử Jepsen và Java Kafka Client.
- Các bài kiểm thử đánh giá độ an toàn của Bufstream bằng cách đưa vào nhiều loại lỗi khác nhau.
Hàng đợi
- Một workload hàng đợi được thiết kế theo mô hình dữ liệu của Kafka và dùng trên Bufstream.
- Mỗi tiến trình logic chạy producer, consumer và client quản trị, đồng thời gửi record cho nhiều key khác nhau.
Hủy bỏ
- Dựa trên các kết quả bất ngờ, một workload được thiết kế để hủy giao dịch và theo dõi offset.
- Offset sau các giao dịch bị hủy được phân thành bốn nhóm: tiến lên, tua lùi, tua lùi thêm, khác.
Kết quả Bufstream
Consumer bị treo (#1)
- Từ 0.1.0 đến 0.1.3-rc.8, đã xảy ra lỗi khiến lệnh gọi
consumer.poll() trả về ngay nhưng không trả record nào.
- Bufstream đã khắc phục vấn đề ở 0.1.3-rc.6 bằng cách làm mới cache.
Producer và consumer bị treo (#2)
- Ngay cả ở 0.1.3-rc.6, vẫn có lỗi khiến lệnh gọi
InitProducerId hoặc listOffsets thất bại.
- Bufstream đã sửa vấn đề bằng cách bổ sung logic polling.
Offset 0 sai (#3)
- Từ 0.1.0 đến 0.1.3-rc.2, đã xảy ra lỗi gán nhầm offset 0.
- Bufstream đã sửa lỗi này ở 0.1.3-rc.6.
Mất bản ghi ghi giao dịch (#4)
- Ở phiên bản 0.1.2, đã xảy ra lỗi khiến các record thuộc giao dịch đã commit bị biến mất.
- Bufstream đã sửa lỗi ở 0.1.3-rc2.
Mất ghi do lọc phía máy chủ (#5)
- Ở 0.1.3-rc.8, mất ghi xảy ra để phản ứng với các lỗi nhẹ.
- Bufstream đã sửa vấn đề ở 0.1.3-rc.12.
Kết quả Kafka
Thông báo lỗi gây hiểu nhầm (KIP-588)
ProducerFencedException cũng có thể xảy ra khi timeout giao dịch.
- Nhóm Kafka được khuyến nghị thay đổi thông báo lỗi.
Khả năng chờ vô hạn khi đóng consumer (KAFKA-17734)
- Lệnh gọi
Consumer.close() có thể chờ vô hạn trong network IO.
- Vấn đề đang được theo dõi qua KAFKA-17734.
Offset consumer khó dự đoán sau thất bại giao dịch (KAFKA-17582)
- Tài liệu hiện thiếu mô tả về hành vi mong đợi của offset consumer khi giao dịch thất bại.
- Consumer có thể tua lùi offset hoặc tiếp tục tiến lên sau một giao dịch bị hủy.
1 bình luận
Ý kiến Hacker News
Trong lúc điều tra các vấn đề xảy ra trong Kafka, người ta phát hiện có các lần ghi không nhìn thấy được. Điều này làm dấy lên khả năng các thông điệp Produce bị trì hoãn bị đưa vào các giao dịch trong tương lai, từ đó vi phạm các đảm bảo của giao dịch. Cũng có nghi ngờ rằng Kafka Java Client có thể tái sử dụng số thứ tự khi yêu cầu bị hết thời gian chờ. Cần thêm nhiều thử nghiệm với Kafka
Khi xem trang sản phẩm của Bufstream, có người thắc mắc hai tuyên bố này tương thích với nhau như thế nào
Cảm thấy ngạc nhiên về tính năng auto-commit của Kafka
Giao thức transaction của Kafka có vấn đề ở mức nền tảng và cần phải được sửa
Có người tò mò liệu Kyle đã xem xét NATS Jetstream chưa
Không tìm thấy dự án GitHub của bufstream. Tò mò không biết có manh mối nào không
Sau khi đọc các bài blog và tài liệu liên quan, có vẻ Kafka định nghĩa "exactly once delivery" là một thuộc tính của thao tác "đọc-xử lý-ghi". Có lẽ mô tả nó như một transaction sẽ phù hợp hơn
Cụm từ "có thể quan sát một phần hoặc toàn bộ transaction" có lẽ nên được hiểu là "consumer có thể quan sát một phần hoặc toàn bộ"
Tò mò không biết phần mềm này được dùng để làm gì. Phục vụ observability? Hộp đen?