Tuyên bố miễn trừ trách nhiệm : Tôi là một thành viên PMC của Apache Flink và là thành viên PMC và chỉ quen thuộc với thiết kế cấp cao của Storm, không phải là nội bộ của nó.
Apache Flink là một khung để xử lý hàng loạt và xử lý hàng loạt. Thời gian chạy của Flink hỗ trợ cả hai miền do chuyển dữ liệu theo đường ống giữa các tác vụ song song bao gồm các xáo trộn theo đường ống. Các bản ghi ngay lập tức được chuyển từ sản xuất tác vụ đến nhận tác vụ (sau khi được thu thập trong bộ đệm để chuyển mạng). Công việc hàng loạt có thể được thực hiện tùy chọn bằng cách sử dụng chặn truyền dữ liệu.
Apache Spark là một khung công tác cũng hỗ trợ xử lý hàng loạt và xử lý luồng. API hàng loạt của Flink trông khá giống nhau và giải quyết các trường hợp sử dụng tương tự như Spark nhưng khác ở bên trong. Để phát trực tuyến, cả hai hệ thống đều tuân theo các cách tiếp cận rất khác nhau (các đợt nhỏ so với phát trực tuyến) khiến chúng phù hợp với các loại ứng dụng khác nhau. Tôi có thể nói so sánh Spark và Flink là hợp lệ và hữu ích, tuy nhiên, Spark không phải là công cụ xử lý luồng tương tự nhất với Flink.
Đến với câu hỏi ban đầu, Apache Storm là một bộ xử lý luồng dữ liệu không có các khả năng hàng loạt. Trên thực tế, bên trong động cơ pipelined của Flink trông hơi giống với Storm, tức là, các giao diện của các tác vụ song song của Flink tương tự như bu lông của Storm. Storm và Flink có điểm chung là họ nhắm đến việc xử lý luồng có độ trễ thấp bằng cách truyền dữ liệu theo đường ống. Tuy nhiên, Flink cung cấp API cấp cao hơn so với Storm. Thay vì triển khai chức năng của bu lông với một hoặc nhiều người đọc và người thu thập, API DataStream của Flink cung cấp các chức năng như Map, GroupBy, Window và Tham gia. Rất nhiều chức năng này phải được thực hiện thủ công khi sử dụng Storm. Một sự khác biệt khác là xử lý ngữ nghĩa. Storm đảm bảo xử lý ít nhất một lần trong khi Flink cung cấp chính xác một lần. Việc triển khai thực hiện các đảm bảo xử lý này khác nhau khá nhiều. Trong khi Storm sử dụng các xác nhận ở mức kỷ lục, Flink sử dụng một biến thể của thuật toán Chandy-Lamport. Tóm lại, các nguồn dữ liệu định kỳ tiêm các điểm đánh dấu vào luồng dữ liệu. Bất cứ khi nào một toán tử nhận được một điểm đánh dấu như vậy, nó sẽ kiểm tra trạng thái bên trong của nó. Khi tất cả các điểm đánh dấu đã nhận được điểm đánh dấu, điểm đánh dấu (và tất cả các bản ghi đã được xử lý trước đó) được cam kết. Trong trường hợp thất bại, tất cả các toán tử nguồn được đặt lại về trạng thái của chúng khi chúng thấy dấu hiệu cam kết cuối cùng và quá trình xử lý được tiếp tục. Cách tiếp cận điểm kiểm tra đánh dấu này nhẹ hơn so với các xác nhận ở mức kỷ lục của Storm. Điều này nguồn dữ liệu định kỳ tiêm đánh dấu vào luồng dữ liệu. Bất cứ khi nào một toán tử nhận được một điểm đánh dấu như vậy, nó sẽ kiểm tra trạng thái bên trong của nó. Khi tất cả các điểm đánh dấu đã nhận được điểm đánh dấu, điểm đánh dấu (và tất cả các bản ghi đã được xử lý trước đó) được cam kết. Trong trường hợp thất bại, tất cả các toán tử nguồn được đặt lại về trạng thái của chúng khi chúng thấy dấu hiệu cam kết cuối cùng và quá trình xử lý được tiếp tục. Cách tiếp cận điểm kiểm tra đánh dấu này nhẹ hơn so với các xác nhận ở mức kỷ lục của Storm. Điều này nguồn dữ liệu định kỳ tiêm đánh dấu vào luồng dữ liệu. Bất cứ khi nào một toán tử nhận được một điểm đánh dấu như vậy, nó sẽ kiểm tra trạng thái bên trong của nó. Khi tất cả các điểm đánh dấu đã nhận được điểm đánh dấu, điểm đánh dấu (và tất cả các bản ghi đã được xử lý trước đó) được cam kết. Trong trường hợp thất bại, tất cả các toán tử nguồn được đặt lại về trạng thái của chúng khi chúng thấy dấu hiệu cam kết cuối cùng và quá trình xử lý được tiếp tục. Cách tiếp cận điểm kiểm tra đánh dấu này nhẹ hơn so với các xác nhận ở mức kỷ lục của Storm. Điều này tất cả các toán tử nguồn được đặt lại về trạng thái của chúng khi chúng thấy dấu hiệu cam kết cuối cùng và quá trình xử lý được tiếp tục. Cách tiếp cận điểm kiểm tra đánh dấu này nhẹ hơn so với các xác nhận ở mức kỷ lục của Storm. Điều này tất cả các toán tử nguồn được đặt lại về trạng thái của chúng khi chúng thấy dấu hiệu cam kết cuối cùng và quá trình xử lý được tiếp tục. Cách tiếp cận điểm kiểm tra đánh dấu này nhẹ hơn so với các xác nhận ở mức kỷ lục của Storm. Điều nàytrượt bộ và tương ứng nói chuyện thảo luận về phương pháp chế biến truyền Flink bao gồm cả khả năng chịu lỗi, checkpointing, và xử lý nhà nước.
Storm cũng cung cấp API cấp cao, chính xác một lần được gọi là Trident. Tuy nhiên, Trident dựa trên các đợt nhỏ và do đó giống với Spark hơn Flink.
Độ trễ có thể điều chỉnh của Flink đề cập đến cách Flink gửi các bản ghi từ một nhiệm vụ này sang nhiệm vụ khác. Tôi đã nói trước đây, Flink sử dụng truyền dữ liệu theo đường ống và chuyển tiếp các bản ghi ngay khi chúng được sản xuất. Để hiệu quả, các bản ghi này được thu thập trong một bộ đệm được gửi qua mạng sau khi nó đầy hoặc một ngưỡng thời gian nhất định được đáp ứng. Ngưỡng này kiểm soát độ trễ của các bản ghi vì nó chỉ định lượng thời gian tối đa mà một bản ghi sẽ ở trong một bộ đệm mà không được gửi đến tác vụ tiếp theo. Tuy nhiên, nó không thể được sử dụng để đưa ra các đảm bảo cứng về thời gian cần thiết để ghi vào khi rời khỏi chương trình vì điều này cũng phụ thuộc vào thời gian xử lý trong các tác vụ và số lần chuyển mạng giữa các thứ khác.