Rất nhiều ứng dụng được xây dựng dựa trên việc có đúng luồng dữ liệu vào ứng dụng tại đúng thời điểm, nhưng điều gì xảy ra nếu những luồng dữ liệu đó không đến khi bạn cần. Reactive Programming là một cách để giải quyết vấn đề này.
Về bản chất, Reactive Programming là phương pháp lập trình cho phép phát triển các ứng dụng được cấu trúc xung quanh các luồng dữ liệu không đồng bộ. Điều này được thực hiện để cải thiện trải nghiệm người dùng.
Reactive Programming được thực hiện để làm cho các ứng dụng phản ứng nhanh hơn. Bạn sẽ không muốn ứng dụng đóng băng để chờ một luồng dữ liệu xuất hiện trực tuyến.
Các sự kiện, tin nhắn, cuộc gọi và thậm chí cả các lỗi sẽ được thực hiện bởi các luồng dữ liệu. Khi các luồng dữ liệu này xuất hiện, Reactive Programming cho phép ứng dụng phản ứng với chúng bằng cách sử dụng hộp công cụ để lọc, tạo, chuyển đổi và kết nối bất kỳ luồng nào trong số đó.
Mã trong ứng dụng phản ứng tạo ra luồng dữ liệu của bất kỳ thứ gì và từ bất kỳ thứ gì, chẳng hạn như yêu cầu HTTP, thư, thông báo, thay đổi đối với biến, sự kiện bộ nhớ đệm, số đo cảm biến và nhấp chuột khiến cho ứng dụng trở nên không đồng bộ về bản chất.
Reactive Programming có thể chuyển đổi hầu hết mọi thứ thành luồng để quản lý không đồng bộ. Nó cũng làm cho việc xử lý lỗi được thực hiện dễ dàng hơn, đồng thời giúp cho mã linh hoạt hơn, dễ đọc hơn, có thể hỗ trợ và dễ viết hơn.
Bốn nguyên tắc để tuân thủ khi tạo các ứng dụng phản ứng.
Đầu tiên là đáp ứng. Nó cần phải nhanh chóng phản ứng với tất cả người dùng.
Thứ hai là linh hoạt. Điều này có nghĩa nó phải áp dụng các nguyên tắc thiết kế và kiến trúc phù hợp để đảm bảo đáp ứng trong mọi điều kiện.
Thứ ba là có thể mở rộng. Nó cần dễ dàng nâng cấp theo yêu cầu để đảm bảo đáp ứng trong điều kiện tải trọng lớn.
Cuối cùng, nền tảng của một hệ thống có khả năng mở rộng, linh hoạt và đáp ứng là kiến trúc hướng thông điệp (message-driven). Ứng dụng hướng tin nhắn có thể được định hướng theo sự kiện (event-driven), dựa trên tác nhân (actor-based) hoặc cả hai.
Reactive Extensions
Reactive Programming như một khái niệm đã tồn tại trong hơn 20 năm nhưng đã không phát triển cho đến Reactive Extensions ra đời. Reactive Extension (còn được gọi là ReactiveX) là giao diện lập trình ứng dụng (Application Programming Interface-API) hoặc lập trình không đồng bộ với các luồng có thể quan sát được.
ReactiveX có hai lớp: lớp có thể quan sát (Observable) và lớp quan sát (Observer). Observable là nguồn dữ liệu của các luồng hoặc các sự kiện và Observer là lớp sử dụng (hoặc phản ứng lại) các phần tử được tạo ra.
Một Observable có thể có nhiều Observer để mỗi mục dữ liệu được tạo ra sẽ được nhận bởi một Observer. Trong ReactiveX, một Observer theo dõi một Observable. Sau đó, Observable tạo ra các luồng dữ liệu, Observer sẽ lắng nghe và phản ứng lại. Điều này tạo ra một loạt các hoạt động trên luồng dữ liệu. Một chủ thể vừa có thể hoạt động như Observer vừa có thể đóng vai trò là Observable.
Chúng ta cũng có thể áp dụng toán tử cho các luồng. Các toán tử xác định cách thức và thời điểm Observable sẽ tạo luồng. Hầu hết các toán tử thực thi các hàm trên Observable và trả về một Observable.