Apache Kafka , thường được gọi đơn giản là Kafka, là một nền tảng mã nguồn mở phổ biến để quản lý và xử lý luồng. Kafka được xây dựng xung quanh khái niệm về một sự kiện. Các tác nhân bên ngoài, độc lập và không đồng bộ, gửi và nhận thông báo sự kiện đến và đi từ Kafka. Kafka chấp nhận một luồng sự kiện liên tục từ nhiều máy khách, lưu trữ chúng và có khả năng chuyển tiếp chúng đến một nhóm máy khách thứ hai để xử lý thêm. Nó linh hoạt, mạnh mẽ, đáng tin cậy, độc lập và cung cấp độ trễ thấp cùng với thông lượng cao. LinkedIn ban đầu đã phát triển Kafka, nhưng Apache Software Foundation cung cấp phiên bản mã nguồn mở hiện tại.
Tổng quan về Apache Kafka
Kafka có thể được coi là một sự triển khai lại hoặc sự phát triển của cơ sở dữ liệu truyền thống cho thế giới phát trực tuyến. Trong khi các cơ sở dữ liệu mà bạn có thể quen thuộc lưu trữ dữ liệu trong các bảng có thuộc tính, khóa và lược đồ được xác định rõ ràng, Kafka có dạng tự do hơn nhiều. Mục đích của Kafka là nhận, lưu trữ và truyền bản ghi các sự kiện thời gian thực .
Trong quy trình làm việc thông thường, một hoặc nhiều ứng dụng sản xuất gửi các thông điệp khóa-giá trị về một chủ đề được xác định trước đến một cụm Kafka. Một cụm bao gồm một hoặc nhiều máy chủ, còn được gọi là broker và mỗi cụm thường lưu trữ các thông điệp cho nhiều chủ đề. Một trong các broker trong cụm nhận các thông điệp này và ghi chúng vào một tệp nhật ký tương ứng với chủ đề. Các tệp nhật ký này được gọi là partition và các chủ đề thường chứa một số phân vùng. Các thông điệp cũng có thể được sao chép đến một số nút khác trong cụm. Các quy trình khác được gọi là consumer sau đó có thể đọc và xử lý các sự kiện trong mỗi phân vùng. Bạn có thể tự viết các ứng dụng consumer và producer này hoặc sử dụng các dịch vụ của bên thứ ba.
Ghi chú: Tại thời điểm viết hướng dẫn này, phiên bản Apache Kafka là 2.7.
Ưu điểm của Apache Kafka
- High Throughput: Kafka dựa trên kiến trúc được tối ưu hóa và hiệu quả cao. Điều này cho phép Kafka xử lý cả độ trễ thấp cũng như thông lượng cao.
- Độ tin cậy cao: Kafka có thể xử lý luồng dữ liệu khối lượng lớn từ nhiều nhà sản xuất (người ghi vào Kafka) và nhiều người tiêu dùng (người thăm dò Kafka để đọc dữ liệu).
- Độ bền: Kafka lưu trữ các sự kiện theo định dạng nhật ký đơn giản và do đó, dữ liệu bền vững và chính sách lưu giữ dễ triển khai. Bạn có thể triển khai Kafka trên máy ảo, máy chủ vật lý và trên đám mây.
- Khả năng mở rộng: Không có thời gian chết của hệ thống, bạn có thể dễ dàng thêm hoặc nâng cấp các nút để tăng thêm độ tin cậy.
- Khả năng của Message Broker: Bạn có thể sắp xếp nhiều Message Broker Kafka thành một cụm có khả năng chịu lỗi và sao chép dữ liệu giữa chúng.
- Thân thiện với người dùng: Kafka có thể tích hợp tốt với nhiều ngôn ngữ lập trình bao gồm Java (ngôn ngữ gốc của Kafka), Go, C++, Python và REST API, rất hữu ích cho việc thử nghiệm và tạo nguyên mẫu.
Kafka cung cấp các ứng dụng như Kafka Connect (để tích hợp các thành phần bên ngoài) và Kafka Streams (để xử lý luồng), cũng như các chính sách bảo mật và truy cập. Nhiều nhà cung cấp đã tham gia với các tiện ích mở rộng của bên thứ ba cho các hệ thống cũ và Kafka cung cấp nhiều API để cả nhà sản xuất và người tiêu dùng sử dụng. Tuy nhiên, cần có kỹ năng lập trình vững chắc để phát triển một ứng dụng Kafka phức tạp.
Các trường hợp sử dụng cho Apache Kafka
Kafka có thể được sử dụng trong nhiều cài đặt khác nhau, nhưng nó phù hợp với các môi trường có luồng dữ liệu thời gian thực. Đây là định dạng lý tưởng cho thế giới hiện đại dựa trên dịch vụ vi mô.
- Kafka đặc biệt hữu ích nếu dữ liệu đến từ nhiều nguồn và hướng đến nhiều đích. Kafka hoạt động tốt nhất với dữ liệu biểu diễn một chuỗi các sự kiện rời rạc theo định dạng sẵn sàng ghi nhật ký.
- Một ứng dụng phù hợp cho Kafka có thể là một hệ thống giám sát nhà đơn giản. Mỗi thiết bị trong nhà là một nhà sản xuất. Mỗi nhà sản xuất này gửi các bản cập nhật trạng thái, báo động, lời nhắc bảo trì và yêu cầu của khách hàng đến Kafka. Các sự kiện được tổng hợp thành một luồng đa thiết bị, được Kafka lưu trữ để tham khảo thêm. Dữ liệu vẫn có sẵn cho các dịch vụ giám sát báo động và cổng thông tin web của khách hàng để truy cập sau này. Dịch vụ giám sát có thể liên tục thăm dò dữ liệu mới, trong khi khách hàng có thể xem lại dữ liệu của họ vào một thời điểm nào đó trong tương lai.
- Kafka cũng có thể phục vụ các hệ thống phức tạp hơn nhiều, chẳng hạn như mạng lưới đặt phòng khách sạn. Dữ liệu có thể đến từ hàng nghìn nhà sản xuất, bao gồm các hệ thống của bên thứ ba. Nó có thể được gửi đến những người tiêu dùng khó tính hơn nhiều, chẳng hạn như tiếp thị, thương mại điện tử và cổng thông tin đặt phòng. Một cụm Kafka lớn có thể bao gồm hàng trăm nhà môi giới và có hàng chục nghìn chủ đề, cùng với các chính sách sao chép và lưu giữ phức tạp.
Trang web Kafka đề cập đến một số miền cấp cao mà cụm Kafka có thể được sử dụng. Một số trong những lĩnh vực này bao gồm:
- Message Broker: Do độ trễ và độ tin cậy thấp của Kafka, nó hoạt động tuyệt vời như một bộ đệm cho các giao tiếp giữa các hệ thống. Thiết kế của nó cho phép tách rời hoàn toàn các nhà sản xuất và người tiêu dùng theo mô-đun. Các nhà sản xuất tốc độ cao, chẳng hạn như các ứng dụng web, có thể ngay lập tức gửi các sự kiện đến Kafka. Sau đó, các hệ thống người tiêu dùng có thể xử lý bộ đệm tin nhắn và thực hiện công việc tốn nhiều thời gian hơn của họ. Người tiêu dùng có thể tạm thời tụt hậu trong các đợt bùng nổ khối lượng lớn mà không làm mất ổn định hệ thống. Kafka chỉ cần tiếp tục lưu trữ các tin nhắn và người tiêu dùng có thể truy xuất chúng khi chúng đã sẵn sàng.
- Theo dõi trang web: Theo dõi web có thể là hoạt động có khối lượng rất lớn nếu một trang web có ý định theo dõi tất cả các hành động của người dùng. Kafka là một lựa chọn tốt cho việc này vì thông lượng cao và hệ thống lưu trữ hiệu quả. Các trình tổng hợp có thể quét dữ liệu sau đó và xây dựng lại dòng thời gian của khách hàng dựa trên ID và chủ đề của từng sự kiện.
- Tổng hợp số liệu/Nhật ký: Kafka phù hợp để ghi nhật ký dữ liệu hoạt động từ nhiều thiết bị mạng. Kafka lưu trữ dữ liệu trực tiếp dưới dạng nhật ký và tóm tắt các chi tiết hệ thống, do đó các thiết bị người dùng cuối đơn giản có thể tương tác nhanh chóng và dễ dàng với dữ liệu.
- Xử lý luồng: Nhiều ứng dụng web hiện đại xử lý luồng cập nhật và gửi của người dùng. Kiểu luồng dữ liệu này tự nhiên thích hợp với xử lý Kafka. Các đường ống có thể đánh giá, sắp xếp và thao tác nội dung này thành định dạng phù hợp với các nguồn thứ cấp.
Kiến trúc của Apache Kafka
Kiến trúc của Kafka bao gồm các thành phần và phần mở rộng được liệt kê bên dưới. Các phần sau đây thảo luận sâu hơn về từng thành phần và phần mở rộng.
- Định dạng tin nhắn sự kiện Kafka
- Chủ đề và Phân vùng
- Các cụm và sao chép (bao gồm cả Zookeeper)
- Nhà sản xuất và Người tiêu dùng
- Bảo mật, Xử lý sự cố và Khả năng tương thích
Định dạng tin nhắn sự kiện Kafka
Trong thuật ngữ Kafka, một sự kiện, một bản ghi và một thông điệp đều đề cập đến cùng một thứ. Kafka và các máy khách của nó chỉ có thể giao tiếp bằng cách trao đổi các sự kiện. Thiết kế Kafka cố tình giữ định dạng thông điệp đơn giản và ngắn gọn để cho phép linh hoạt hơn. Mỗi thông điệp chứa các trường sau:
- Tiêu đề siêu dữ liệu: Mỗi tiêu đề có độ dài thay đổi bao gồm các trường bao gồm độ dài tin nhắn, khóa, độ lệch giá trị, CRC, ID nhà sản xuất và ID ma thuật (tương tự như phiên bản). API Kafka tự động xây dựng các tiêu đề.
- Khóa: Mỗi ứng dụng định nghĩa khóa riêng của mình. Khóa không rõ ràng và có độ dài thay đổi. Trong một ứng dụng thông thường, khóa đề cập đến một người dùng, khách hàng, cửa hàng, thiết bị hoặc vị trí cụ thể. Nó trả lời các câu hỏi như:
- Ai hoặc cái gì đã tạo ra sự kiện này?
- Sự kiện này liên quan đến ai hoặc cái gì?
- Giá trị: Giá trị không rõ ràng và có độ dài thay đổi tương tự như Khóa . Cấu trúc mở cho phép bạn lưu trữ bất kỳ lượng dữ liệu nào ở bất kỳ định dạng nào. Giá trị có thể là bản ghi nhiều trường được chuẩn hóa hoặc mô tả chuỗi đơn giản, nhưng giá trị thường có ít nhất một số cấu trúc.
- Dấu thời gian: Biểu thị thời gian nhà sản xuất tạo ra sự kiện hoặc thời gian Kafka nhận được sự kiện đó.
Chủ đề và phân vùng Kafka
Mỗi sự kiện được lưu trữ bên trong một chủ đề Kafka và mỗi chủ đề chứa nhiều sự kiện. Một chủ đề có thể được coi như một thư mục tệp. Mỗi “thư mục” chứa nhiều tệp riêng lẻ đại diện cho các sự kiện. Kafka cho phép một số lượng không giới hạn các nhà sản xuất xuất bản các sự kiện trên cùng một chủ đề.
Các sự kiện trong một chủ đề có các khả năng sau:
- Chúng không thể thay đổi và vẫn tồn tại sau khi được đọc, do đó có thể truy cập nhiều lần.
- Chúng có thể được lưu trữ vô thời hạn tùy thuộc vào giới hạn lưu trữ. Theo mặc định, các sự kiện được lưu trong bảy ngày. Mỗi sự kiện trong một chủ đề được lưu trữ trong một phân vùng được chỉ định.
Các chủ đề Kafka có thể được quản lý thông qua API Quản trị Kafka . Các chủ đề của Kafka được chia thành nhiều phân vùng . Một số thông tin về phân vùng của Kafka như sau:
- Kafka nhóm các thông điệp lại với nhau khi truy cập vào một phân vùng, tạo ra các bản ghi tuyến tính hiệu quả. Mỗi thông điệp nhận được một số tăng dần theo trình tự và được lưu trữ tại một offset trong phân vùng của nó. Điều này được sử dụng để duy trì thứ tự nghiêm ngặt.
- Các sự kiện trong phân vùng luôn được đọc theo cùng thứ tự chúng được ghi, nhưng bạn có thể chọn nén chủ đề Kafka.
- Khi nén được thiết lập, các sự kiện cũ hơn không tự động hết hạn. Tuy nhiên, khi có sự kiện mới, Kafka sẽ loại bỏ các sự kiện cũ hơn có cùng khóa. Chỉ giữ lại bản cập nhật mới nhất. Bạn có thể chọn áp dụng chính sách xóa hoặc chính sách nén, nhưng không được áp dụng cả hai.
Cụm Kafka và sao chép
Mặc dù bạn chắc chắn có thể chạy Kafka trên một máy chủ độc lập, nhưng nó hoạt động tốt nhất khi chạy trên một cụm.
- Một số máy chủ trong cụm hoạt động như các nhà môi giới để lưu trữ dữ liệu. Các máy chủ khác trong cụm có thể chạy các dịch vụ như Kafka Connect và Kafka Streams thay thế. Việc nhóm các máy chủ theo cách này giúp tăng dung lượng và cũng cho phép độ tin cậy và khả năng chịu lỗi cao.
- Kafka sử dụng tác vụ quản lý trung tâm có tên là Zookeeper để kiểm soát từng cụm. Zookeeper bầu và theo dõi các trưởng nhóm để giám sát trạng thái của các thành viên cụm và quản lý các phân vùng.
- Zookeeper tùy chọn duy trì Access Control List (ACL). Bạn phải khởi chạy Zookeeper trước khi khởi động Kafka, nhưng nếu không, bạn không phải chủ động quản lý nó. Cấu hình cụm của bạn xác định cách Zookeeper hoạt động. Bạn có thể sử dụng API quản trị Kafka để quản lý các thiết lập cụm và sao chép.
Kafka sao chép các phân vùng giữa các máy chủ để có một số bản sao lưu trên các máy chủ khác. Một bộ gồm ba hoặc bốn máy chủ là điển hình. Một trong các broker được bầu làm leader trên cơ sở mỗi phân vùng. Leader nhận các sự kiện từ producer và gửi các bản cập nhật cho consumer. Các broker còn lại đóng vai trò là người theo dõi. Họ truy vấn leader để biết các sự kiện mới và lưu trữ các bản sao lưu.
Bạn có thể cấu hình cụm Kafka cho các mức độ tin cậy khác nhau. Kafka có thể gửi xác nhận khi lần đầu tiên nhận được tin nhắn hoặc khi một số máy chủ sao lưu nhất định cũng đã tạo bản sao. Phương pháp đầu tiên nhanh hơn, nhưng một lượng nhỏ dữ liệu có thể bị mất nếu máy chủ chính bị lỗi. Producer có thể chọn không nhận bất kỳ xác nhận nào nếu mục tiêu là xử lý nỗ lực tốt nhất. Kafka không tự động cân bằng bất kỳ chủ đề, phân vùng hoặc bản sao nào. Quản trị viên Kafka phải quản lý các tác vụ này.
Nhà sản xuất và Người tiêu dùng
Nhà sản xuất và người dùng đều có thể sử dụng API quản trị Kafka để giao tiếp với Kafka.
- Các ứng dụng sử dụng các API này để chỉ định chủ đề và gửi thông điệp khóa-giá trị tới cụm.
- Người tiêu dùng sử dụng API để yêu cầu tất cả dữ liệu đã lưu trữ hoặc liên tục thăm dò để cập nhật.
Cụm Kafka theo dõi vị trí của từng người dùng trong một phân vùng nhất định để biết những bản cập nhật nào vẫn phải gửi. Kafka Connect và Kafka Streams giúp quản lý luồng thông tin đến hoặc đi từ Kafka.
Hướng dẫn cài đặt Kafka của chúng tôi bao gồm ví dụ về cách sử dụng API của nhà sản xuất và người dùng.
Bảo mật, Xử lý sự cố và Khả năng tương thích
Theo mặc định, các cụm và trình môi giới Kafka không an toàn, nhưng Kafka hỗ trợ nhiều tùy chọn bảo mật.
- Khi sử dụng SSL, bạn có thể xác thực kết nối giữa bên môi giới và khách hàng, cũng như giữa bên môi giới và Zookeeper.
- Bạn có thể thực thi quyền cho các hoạt động đọc và ghi và mã hóa dữ liệu trong quá trình truyền. Kafka hỗ trợ kết hợp các máy khách đã xác thực và chưa xác thực và mức độ chi tiết cao đối với các thiết lập bảo mật.
Kafka cũng cung cấp các công cụ để theo dõi hiệu suất và số liệu nhật ký, cùng với các nhật ký lỗi thông thường. Một số công cụ của bên thứ ba cung cấp các trung tâm lệnh Kafka và ảnh chụp nhanh toàn cảnh của toàn bộ cụm.
Khi nâng cấp các nhà môi giới Kafka hoặc các máy khách riêng lẻ, điều quan trọng là phải xem xét các vấn đề về khả năng tương thích. Quá trình tiến hóa lược đồ phải được lập kế hoạch hợp lý, với các thành phần được nâng cấp theo đúng thứ tự cùng với việc xử lý không khớp phiên bản. Luồng Kafka cung cấp xử lý phiên bản để hỗ trợ di chuyển máy khách.
Kết nối Kafka
Kafka Connect là một khuôn khổ để nhập dữ liệu từ các hệ thống khác hoặc xuất dữ liệu sang các hệ thống đó. Điều này cho phép tích hợp dễ dàng hơn giữa Kafka và cơ sở dữ liệu truyền thống.
Một số lợi ích của Kafka Connect bao gồm:
- Kafka Connect chạy trên máy chủ riêng của nó thay vì trên một trong những trình môi giới Kafka thông thường.
- API Kafka Connect được xây dựng dựa trên API Consumer và Producer để triển khai các chức năng kết nối cho nhiều hệ thống cũ.
- Kafka Connect không đi kèm với bất kỳ trình kết nối nào sẵn sàng cho sản xuất, nhưng có nhiều tiện ích mã nguồn mở và thương mại có sẵn. Ví dụ, bạn có thể sử dụng trình kết nối Kafka Connect để nhanh chóng chuyển dữ liệu ra khỏi cơ sở dữ liệu quan hệ cũ và vào cụm Kafka của bạn.
Luồng Kafka
Kafka Streams là một thư viện được thiết kế để xử lý luồng nhanh. Nó chấp nhận dữ liệu đầu vào từ Kafka, hoạt động trên dữ liệu và truyền lại dữ liệu đã chuyển đổi. Ứng dụng Kafka Streams có thể gửi dữ liệu này đến một hệ thống khác hoặc gửi lại cho Kafka.
Một số lợi ích của Kafka Streams là:
- Kafka Streams cung cấp các tiện ích để lọc, lập bản đồ, nhóm, tổng hợp, tạo cửa sổ và nối dữ liệu.
- Độ bền cao: Tiện ích mở rộng RocksDB mã nguồn mở cho phép xử lý luồng có trạng thái và lưu trữ dữ liệu đã xử lý một phần trên đĩa cục bộ.
- Xử lý luồng: Kafka Streams cung cấp ghi giao dịch, đảm bảo xử lý “chính xác một lần”. Điều này có nghĩa là nó có thể thực hiện chu kỳ đọc-xử lý-ghi một lần, mà không bỏ lỡ bất kỳ thông báo đầu vào nào cũng như không tạo ra thông báo đầu ra trùng lặp.
Cài đặt Kafka
Bạn phải cài đặt Java trước khi cài đặt Apache Kafka. Bản thân Kafka rất dễ cài đặt, khởi tạo và chạy.
- Trang web Kafka có hướng dẫn cơ bản.
- Chúng tôi cũng có hướng dẫn về cách cài đặt Apache Kafka , hướng dẫn này trình bày cách xây dựng một nhà sản xuất và người tiêu dùng đơn giản và xử lý dữ liệu bằng Kafka Streams.
Tham khảo thêm
Apache cung cấp tài liệu và vật liệu hỗ trợ mở rộng cho Kafka.
- Trang web tài liệu về Kafka thảo luận về thiết kế, triển khai và vận hành Kafka, đồng thời đi sâu vào các tác vụ phổ biến.
- Thông tin API chuyên sâu có trên trang Kafka JavaDocs . Bạn có thể tham khảo tổng quan cấp cao về từng lớp cùng với giải thích về các phương pháp khác nhau.
- Bạn cũng có thể tham khảo tài liệu Kafka Streams có bản demo và hướng dẫn khá chi tiết.
Thông tin thêm
Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.
Nguồn : https://www.linode.com/docs/guides/what-is-apache-kafka/