Giới thiệu
Chào mừng bạn đến với thế giới của dữ liệu streaming - thế giới của Kafka. Hãy sẵn sàng để "đăng ký" vào một dòng tư tưởng hoàn toàn mới giúp bạn quản lý và xử lý dữ liệu hiệu quả hơn.
Kafka là gì?
Apache Kafka được thành lập bởi LinkedIn và sau đó được Apache tiếp nhận dưới giấy phép mã nguồn mở. Điều này có nghĩa là bạn có thể tùy chỉnh Kafka để phù hợp với nhu cầu của mình.
Kafka là một nền tảng dữ liệu streaming mã nguồn mở sử dụng mô hình publish và subscribe để tách rời các ứng dụng, giảm sự phụ thuộc lẫn nhau. Nó thực hiện điều này bằng cách giữ lại các bản ghi sự kiện giữa các microservices trong một ứng dụng.
Tình huống
Hãy tưởng tượng bạn là chủ sở hữu của một doanh nghiệp với cấu trúc như hình dưới đây. Mọi thứ có thể diễn ra suôn sẻ ban đầu, nhưng điều gì sẽ xảy ra khi một nút trong hệ thống gặp sự cố?
Giả sử, microservice thanh toán gặp lỗi. Tình huống này có thể khiến khách hàng của bạn phải chờ đợi trên màn hình tải khi đơn hàng được đặt cho một sự hoàn tất thanh toán mà sẽ không bao giờ đến. Thậm chí tệ hơn, đơn hàng này có thể bị ghi vào phần phân tích, làm hỏng dữ liệu của bạn.
Đây chính là lúc Kafka tỏa sáng. Nó đặt mình giữa các microservices để hoạt động như một người trung gian, từ đó:
- Loại bỏ điểm đơn lẻ của sự cố
- Cải thiện khả năng phục hồi
Các khái niệm cốt lõi của Kafka
Có một số khái niệm bạn cần nắm vững khi làm việc với Kafka:
Mô hình publish-subscribe
Đây là một mẫu kiến trúc nhắn tin trong đó các ứng dụng sinh ra dữ liệu (các nhà xuất bản) gửi tin nhắn đến một trung gian gọi là message broker mà không cần biết ai sẽ nhận chúng. Điều này mang lại lợi ích về sự tách rời và khả năng tương tác, vì các hệ thống chỉ cần giao tiếp với Kafka thay vì tạo các tích hợp tùy chỉnh cho từng hệ thống.
Kiến trúc dựa trên sự kiện
Cách suy nghĩ này chuyển hướng trọng tâm từ việc yêu cầu dữ liệu hoặc gọi dịch vụ sang phản ứng với các sự kiện và thực tế kinh doanh khi chúng xảy ra.
Các thành phần kiến trúc của Kafka
Bây giờ, hãy cùng khám phá những hoạt động bên trong của Kafka bằng việc mô tả ngắn gọn các thành phần của nó:
- Bản ghi (Record): Là thông điệp thực tế được sản xuất bởi microservice xuất bản.
- Nhà sản xuất (Producer): Là microservice xuất bản tạo ra và gửi tin nhắn đến Kafka.
- Người tiêu dùng (Consumer): Là microservice đăng ký lắng nghe và nhận tin nhắn đến từ Kafka.
- Chủ đề (Topic): Tương đương với bảng cơ sở dữ liệu trong Kafka. Nó là một bản ghi sự kiện không thể thay đổi mà người tiêu dùng và nhà sản xuất đăng ký và xuất bản. Bạn có thể có một chủ đề đơn hàng cho microservice đơn hàng.
- Broker: Là máy chủ thực tế mà Kafka chạy trên đó.
- Cụm Kafka (Kafka cluster): Một phiên bản Kafka có thể chạy trên nhiều máy chủ (nút/broker). Những máy chủ này tạo thành cụm Kafka.
- Phân vùng (Partitioning): Là phân chia logic của một chủ đề thành nhiều nút trong cụm Kafka.
- Sao chép (Replication): Các phân vùng có thể được sao chép trên nhiều nút để tạo ra các bản sao có thể hoạt động như bản sao lưu trong trường hợp một nút gặp sự cố.
- Zookeeper: Việc phân vùng và sao chép có thể là một công việc phức tạp, đặc biệt khi liên quan đến tính nhất quán dữ liệu. Zookeeper là một tài nguyên bên ngoài giải quyết vấn đề này, xử lý việc điều phối và đồng bộ hóa của Kafka.
- Kraft: Là một phần bên trong mới của Kafka ra đời trên Kafka 3.3, xử lý các chức năng của Zookeeper, loại bỏ sự phụ thuộc của Kafka vào Zookeeper.
- Nhóm tiêu dùng (Consumer Group): Giả sử hệ thống của bạn tận dụng sao chép của microservices để cải thiện khả năng mở rộng và truy cập. Việc sản xuất có thể đơn giản khi mỗi bản sao của microservice nhà sản xuất chỉ gửi một bản ghi khác nhau đến một chủ đề. Nhưng nếu các bản sao nhà sản xuất đăng ký vào chủ đề đó, chúng sẽ nhận tất cả các tin nhắn theo thứ tự tuần tự. Đây là vấn đề mà nhóm tiêu dùng giúp giải quyết. Nhiều phiên bản tiêu dùng thuộc cùng một ứng dụng hoặc dịch vụ logic được cấu hình với cùng một ID nhóm. ID nhóm này xác định chúng là một phần của cùng một nhóm tiêu dùng. Điều này cho phép Kafka điều phối việc tiêu thụ tin nhắn sao cho chúng được xử lý song song bởi các bản sao microservice tiêu dùng khác nhau.
Cài đặt
Bây giờ, hãy bắt tay vào thực hành bằng cách cài đặt và chạy một phiên bản Kafka trong terminal của chúng ta.
Lưu ý: Kafka trên console không nên được sử dụng trong môi trường sản xuất trừ khi thật sự cần thiết. Hãy TRÁNH sử dụng trong sản xuất bất cứ lúc nào.
Nhưng vì chúng ta đang chạy một phiên bản Kafka đơn giản với một phân vùng trên PC của mình, nên điều này là ổn. Hãy làm theo các bước dưới đây.
Cài đặt Java
bash
sudo apt install default-jre
Xác nhận cài đặt Java
bash
java --version
Hãy chắc chắn sử dụng Java 11 hoặc 17.
Các lệnh dưới đây tải xuống Kafka, giải nén nó, sau đó đổi tên thư mục kafka (để có một tên dễ đọc hơn, Kafka, sẽ hoạt động như thư mục chính của Kafka). Cuối cùng, di chuyển vào thư mục Kafka.
bash
wget https://archive.apache.org/dist/kafka/3.3.1/kafka_2.13-3.3.1.tgz
tar -xzvf kafka_2.13-3.3.1.tgz
mv kafka_2.13-3.3.1/ kafka/
cd kafka/
Khởi động Zookeeper
bash
bin/zookeeper-server-start.sh config/zookeeper.properties
Khởi động Kafka
bash
bin/kafka-server-start.sh config/server.properties
Tạo một chủ đề thử nghiệm trong Kafka
bash
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Tạo một nhà sản xuất
bash
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
Điều này sẽ mở ra một console tương tác nơi bạn có thể nhập tin nhắn cho chủ đề thử nghiệm đã tạo.
Tạo một người tiêu dùng trong một terminal khác
bash
bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
Bây giờ, khi bạn nhập bất kỳ điều gì trên terminal của nhà sản xuất, nó sẽ hiển thị trên bên phía người tiêu dùng. Bạn đã bắt đầu streaming dữ liệu với Kafka!
Các trường hợp sử dụng
Kafka console - (trường hợp đặc biệt)
Người tiêu dùng và nhà sản xuất thường là các ứng dụng hoặc microservices; tuy nhiên, console Kafka cho phép lập trình viên trở thành nhà sản xuất. Điều này không lý tưởng trong sản xuất vì bất kỳ bản ghi sai hoặc sai chính tả nào do lập trình viên hoặc nhà sản xuất tạo ra sẽ trở thành bản ghi không thể đảo ngược trong chủ đề đó. Hơn nữa, nếu nhiều microservices đăng ký vào chủ đề này, điều này có thể kích hoạt một chuỗi sự kiện không mong muốn có thể gây ra thảm họa.
Tuy nhiên, nó vẫn là một tính năng hữu ích trong một số kịch bản.
Kiểm tra
Nếu bạn cần xác nhận xem dịch vụ Kafka mà bạn muốn có hoạt động như mong đợi hay không, hãy làm như chúng ta đã làm trong phần cài đặt. Điều này có nghĩa là:
- Bạn đã triển khai một cụm mới và muốn thử nghiệm.
- Bạn đang gỡ lỗi một vấn đề với một cụm hiện có.
Lấp đầy dữ liệu
Giả sử microservice đơn hàng của bạn gặp sự cố trước khi nó tắt, và một vài đơn hàng đã được đặt nhưng chưa thể đưa vào chủ đề. Đừng lo lắng, bạn có một bản sao lưu được lưu trong tệp CSV phòng trường hợp gặp sự cố, bạn chỉ cần chạy lệnh sau:
bash
kafka-console-producer \
--topic example-topic \
--bootstrap-server localhost:9092 \
< your_prepared_backorders.csv
Miễn là schema phù hợp với schema của chủ đề.
Các trường hợp sử dụng thực tế
Netflix
Khi nghĩ về Netflix, bạn nghĩ đến việc truy cập ngay lập tức vào bộ phim hoặc series yêu thích của mình. Nhưng điều gì xảy ra phía sau khi bạn nhấn nút “Phát”? Netflix sử dụng Kafka để xử lý việc giám sát thời gian thực và xử lý sự kiện trên toàn bộ nền tảng của mình.
Mỗi khi bạn phát, tạm dừng, tua nhanh, hoặc thậm chí chỉ di chuột qua một tiêu đề, một sự kiện được tạo ra. Kafka hoạt động như một người trung gian, vận chuyển hàng tỷ sự kiện mỗi ngày đến các dịch vụ khác nhau:
- Công cụ gợi ý – để đề xuất những gì bạn nên xem tiếp theo.
- Giám sát chất lượng dịch vụ (QoS) – để đảm bảo độ phân giải video điều chỉnh mượt mà theo mạng của bạn.
- Cảnh báo vận hành – để các kỹ sư có thể hành động nếu có điều gì đó hỏng trong quy trình truyền tải.
Nếu không có Kafka, lượng sự kiện thời gian thực khổng lồ sẽ làm cho các dịch vụ riêng lẻ bị quá tải. Bằng cách tập trung những sự kiện này, Netflix đạt được tính mở rộng, độ bền và cá nhân hóa theo thời gian thực.
Uber
Uber không chỉ là một ứng dụng gọi xe. Nó là một nền tảng logistics thời gian thực di chuyển người, thực phẩm và thậm chí cả hàng hóa xung quanh các thành phố trên toàn thế giới. Đây là cách Kafka hoạt động:
Mỗi chuyến đi tạo ra một dòng sự kiện GPS liên tục từ cả ứng dụng tài xế và hành khách. Kafka tiếp nhận và streaming những sự kiện này theo thời gian thực đến các dịch vụ khác nhau:
- Dịch vụ kết nối – để kết nối bạn với tài xế gần nhất.
- Tính toán ETA – để cập nhật thời gian đến một cách động khi có sự thay đổi giao thông.
- Giá cước tăng – để điều chỉnh giá ngay lập tức trong thời gian cao điểm.
- Phát hiện gian lận – để phát hiện hoạt động đáng ngờ khi nó xảy ra.
Kafka cho phép Uber xử lý hàng triệu sự kiện đồng thời, với độ trễ thấp trên nhiều vùng địa lý, đảm bảo rằng việc đi lại, giao hàng và thanh toán diễn ra suôn sẻ mà không gặp phải tắc nghẽn.
Các thực hành tốt nhất trong sản xuất
Việc chạy Kafka trên laptop của bạn là thú vị cho các buổi demo, nhưng trong sản xuất, câu chuyện hoàn toàn khác. Các công ty lớn đã học được (đôi khi là theo cách khó khăn) rằng để giữ cho Kafka đáng tin cậy ở quy mô lớn, bạn cần tuân theo một số thực hành tốt nhất:
Phân vùng và sao chép
Trong sản xuất, các công ty thường chạy các cụm với nhiều broker trải rộng trên các máy hoặc thậm chí trên các trung tâm dữ liệu khác nhau. Các chủ đề được phân vùng để mở rộng quy mô ngang và được sao chép (thường với hệ số sao chép bằng 3) để đảm bảo tính chịu lỗi. Bằng cách này, ngay cả khi một broker gặp sự cố, cụm vẫn có thể tiếp tục mà không mất dữ liệu.
Chính sách lưu trữ và dung lượng
Các chủ đề có thể phát triển vô hạn trong sản xuất, điều này không tốt khi máy của bạn có dung lượng bộ nhớ hữu hạn. Do đó, tốt hơn là có một thiết bị thu gom rác để sẵn sàng. Trong các nhóm sản xuất, thiết lập các chính sách lưu trữ (ví dụ: 7 ngày hoặc 30 ngày) để tự động xóa các tin nhắn cũ. Họ điều chỉnh nén nhật ký để chỉ giữ lại giá trị mới nhất cho mỗi khóa khi cần thiết. Lưu trữ, thông lượng đĩa và băng thông mạng được lập kế hoạch cẩn thận trước khi mở rộng quy mô.
Kết luận
Apache Kafka là một nền tảng mạnh mẽ cho việc xử lý dữ liệu theo thời gian thực. Với các khái niệm cốt lõi và các thực hành tốt nhất trong sản xuất mà chúng ta đã khám phá, bạn đã sẵn sàng để áp dụng Kafka vào các ứng dụng của mình. Hãy bắt đầu hành trình của bạn với Kafka ngay hôm nay và khám phá tiềm năng vô hạn mà nó mang lại cho hệ thống của bạn.
Câu hỏi thường gặp (FAQ)
Kafka có thể được sử dụng cho những ứng dụng nào?
Kafka thường được sử dụng cho các ứng dụng yêu cầu xử lý sự kiện theo thời gian thực, như giám sát, phân tích dữ liệu, và giao tiếp giữa các microservices.
Có nên sử dụng Kafka cho môi trường sản xuất không?
Có, nhưng bạn cần đảm bảo tuân thủ các thực hành tốt nhất như phân vùng và sao chép để đảm bảo tính ổn định và độ tin cậy.
Kafka và RabbitMQ khác nhau như thế nào?
Kafka được thiết kế cho việc xử lý dữ liệu theo thời gian thực với độ trễ thấp, trong khi RabbitMQ thường được sử dụng cho các ứng dụng yêu cầu tính nhất quán cao hơn trong việc gửi và nhận tin nhắn.
Làm thế nào để tối ưu hóa hiệu suất của Kafka?
Bạn có thể tối ưu hóa hiệu suất của Kafka bằng cách điều chỉnh kích thước phân vùng, sao chép dữ liệu, và thiết lập các chính sách lưu trữ hợp lý.
Tài liệu tham khảo
- Hướng dẫn Kafka cho người mới bắt đầu | Tất cả những gì bạn cần để bắt đầu, TechWorld với Nana
- Hướng dẫn Kafka—Hướng dẫn nhiều chương, RedPanda
- Đặc trưng Apache Kafka trong Studio Netflix và Thế giới Tài chính, Confluent
- Lưu trữ Kafka—Các loại, thách thức, giải pháp thay thế, Red Panda