10 điểm bởi GN⁺ 2025-07-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • xkafka là một thư viện mã nguồn mở giúp sử dụng Kafka trong môi trường Go đơn giản như một dịch vụ HTTP
  • Khi dùng confluent-kafka-go trước đây, cần các vòng lặp xử lý phức tạp và nhiều mã boilerplate, nhưng xkafka với cấu trúc Handler, Middleware, Message giúp bạn tập trung vào logic cốt lõi
  • Xuất bản và tiêu thụ message được xử lý trực quan như mô hình request/response của HTTP, đồng thời che giấu phần lớn độ phức tạp của Kafka như quản lý offset, thiết lập đồng thời, xử lý lỗi
  • Hỗ trợ đơn giản nhiều mẫu thường dùng trong dịch vụ thực tế như xử lý Streaming/Batch, xử lý tuần tự/bất đồng bộ, đảm bảo At-most-once/At-least-once
  • Có thể dễ dàng áp dụng các mẫu cần thiết trong thực tế như xử lý lỗi phân tầng, retry/logging/metrics dựa trên middleware

Kafka kiểu HTTP

  • xkafka là thư viện trừu tượng hóa Kafka trong Go theo kiểu một dịch vụ HTTP
    • Message tương tự một HTTP request, bao gồm topic/partition/offset/key/value/header/callback...
    • Handler xử lý logic nghiệp vụ giống như HTTP Handler
    • Middleware cho phép tách các chức năng bổ sung như logging, metrics, retry khỏi logic nghiệp vụ để áp dụng riêng

Xuất bản message (Publishing Messages)

  • Tạo Producer bằng xkafka.NewProducer, sau đó tạo đối tượng message và xuất bản bằng hàm Publish
  • Có thể xuất bản bất đồng bộ (AsyncPublish) và đăng ký callback, giúp xử lý sự kiện bất đồng bộ hoặc yêu cầu hiệu năng cao dễ dàng hơn
  • Việc truyền message được xử lý trong goroutine nền, và có thể theo dõi trạng thái truyền qua callback

Tiêu thụ message (Consuming Messages)

  • Khi tạo Consumer, chỉ định hàm Handler cùng các thiết lập như topic/broker/cấu hình
  • Có thể thêm middleware bằng consumer.Use()
  • Bắt đầu tiêu thụ message bằng consumer.Run(ctx)

Streaming vs. Batch

  • Streaming: xử lý ngay từng message một mỗi khi message đến. Phù hợp khi lưu lượng không lớn, cần tiết kiệm bộ nhớ hoặc cần đảm bảo xử lý chặt chẽ
  • Batch: gom theo số lượng hoặc theo khoảng thời gian rồi xử lý. Phù hợp với hệ thống thông lượng cao hoặc để giảm tải cho downstream

Sequential hay Async

  • Mặc định là xử lý tuần tự (Sequential) — phải xử lý xong một message mới đọc message tiếp theo
  • Khi dùng xkafka.Concurrency(N), hỗ trợ chế độ bất đồng bộ (Async) để xử lý đồng thời N message (hoặc batch)

Quản lý offset

  • Cơ chế mặc định của Kafka là đẩy offset tiến lên ngay khi message được giao, nên có thể gây mất message khi xảy ra sự cố
  • xkafka đặt enable.auto.offset.store=false để chỉ lưu offset sau khi message (hoặc batch) đã được xử lý xong
  • Không cần quản lý trạng thái message bằng DB hay queue riêng mà vẫn có thể đảm bảo xử lý ngay trong Kafka
  • Đảm bảo At-Most-Once

    • Về cơ bản, offset được commit trong nền theo enable.auto.commit=true của Kafka
    • Với xkafka.ManualCommit(true) và xử lý tuần tự, offset được commit trước khi đọc từng message/batch để đảm bảo At-most-once
  • Đảm bảo At-Least-Once

    • Kết hợp xkafka.ManualCommit(true) với đồng thời (N>1) để commit offset đồng bộ theo đúng thứ tự ngay cả khi xử lý song song
    • Có thể dễ dàng áp dụng mô hình đảm bảo At-least-once

Xử lý lỗi

  • Cấp độ Handler

    • Có thể xử lý lỗi ứng dụng trong Handler và gửi sang Dead Letter Queue, v.v.
    • Có thể điều khiển tường minh bằng msg.AckSuccess() khi thành công, msg.AckSkip() khi bỏ qua, msg.AckFail(err) khi thất bại
  • Cấp độ Middleware

    • Có thể tái sử dụng logic chung như retry, logging lỗi... trong middleware cho nhiều Handler
    • Dễ dàng áp dụng chính sách retry hoặc cách xử lý khác nhau tùy theo từng loại lỗi
  • Cấp độ Global

    • Lỗi từ Kafka broker/thư viện được xử lý tập trung trong tùy chọn bắt buộc xkafka.ErrorHandler
    • Nếu handler này trả về lỗi non-nil, hoạt động của Consumer/Producer sẽ dừng lại

Kết luận

  • xkafka biến trải nghiệm sử dụng phức tạp của Apache Kafka thành một cấu trúc máy chủ HTTP quen thuộc với lập trình viên Go
  • Giảm mã boilerplate không cần thiết và tạo môi trường để chỉ tập trung vào logic nghiệp vụ
  • So với mã confluent-kafka-go hiện có, cách tiếp cận này ngắn gọn và trực quan hơn nhiều
  • Có thể bắt đầu ngay bằng cách tham khảo tài liệuví dụ chính thức

1 bình luận

 
penza1 2025-07-13

Hmm, tôi cứ nghĩ trong golang thì
sarama đang được ưa chuộng hơn cơ mà..
Kafka client còn phức tạp hơn tưởng tượng nữa.. khi broker gặp sự cố hoặc có ngoại lệ thì rất phức tạp,
không biết có thể bao quát hết mọi trường hợp hay không ..