Phát triển phần mềm thời hiện đại vẫn còn rất nhiều điều để học từ những năm 1970, một trong số đó là triết lí Unix. Chúng ta có thể làm được vô vàn khả năng chỉ với vài sự kết hợp của các lệnh awk, sed, grep, sort, uniq và xargs trong hệ điều hành Unix. Điều này không hề là ngẫu nhiên, đó là kết quả trực tiếp từ triết lí thiết kế của Unix:
- Làm cho mỗi chương trình làm tốt một việc. Để thực hiện một công việc mới, hãy làm chương trình mới, thay vì làm phức tạp các chương trình cũ bằng cách thêm các “tính năng” mới.
- Đầu ra của mọi chương trình trở thành đầu vào cho một chương trình khác không được biết trước
Những nguyên tắc này là nền tảng cho việc kết hợp (compose) các chương trình lại với nhau để thực hiện một công việc phức tạp, thông qua pipe ( “|”). Ý tưởng chính ở đây là một chương trình không biết hoặc không quan tâm đầu vào của nó đến từ đâu hoặc đầu ra của nó sẽ đến đâu: nó có thể là một file hoặc một chương trình khác thuộc hệ điều hành hoàn toàn khác.
Trong thực tế,
Kafka thực chất có rất nhiều điểm tương đồng với pipe trong Unix, liên kết đầu ra của một tiến trình với đầu vào của một tiến trình khác. Và
Samza giống như một thư viện giúp bạn đọc từ đầu vào và viết vào đầu ra. Sử dụng Kafka và Samza, bạn có thể lập trình với phong cách xử lí luồng (stream-processing) giống với phong cách Unix truyền thống, gồm các tool nhỏ và có khả năng kết hợp (composable)
Các nguyên tắc thiết kế giống Unix của Kafka cho phép xây dựng các hệ thống phức tạp ở quy mô lớn. Trong một tổ chức lớn, Kafka giúp mỗi team có thể độc lập phát triển các công việc xử lí luồng (steam-processing job), consume từ một luồng và publish sang luồng mới. Các luồng dữ liệu trong Kafka đóng vai trò là kênh giao tiếp giữa các hệ thống của các team khác nhau. Mỗi team tập trung giúp hệ thống của họ làm tốt một việc duy nhất.
Giống như các tool trong Unix có thể được kết hợp với nhau để hoàn thành một nhiệm vụ cụ thể, các hệ thống phân tán này được kết hợp với nhau, điều hành toàn bộ hoạt động của cả tổ chức lớn. Nhờ tính loose-coupling, các thành phần riêng lẻ có thể được phát triển và deploy hoàn toàn độc lập. Nhờ khả năng chịu lỗi và buffering của Kafka, khi có lỗi xảy ra ở một phần của hệ thống, nó sẽ được khoanh vùng và tách biệt. Các tổ chức này giúp mỗi team có thể phát triển nhanh chóng mà không sợ ảnh hưởng hay gián đoạn các team khác.
Trong bài viết, tác giả có miêu tả chi tiết triết lí Unix, sự khác biệt trong thiết kế database so với Unix, so sánh và nêu những điểm lợi của Kafka so với Unix pipe, và nhiều ví dụ thực tế. Mời các bạn cùng đọc.
(by nghialuu)