Ở bài viết này, tui sẽ viết về một số kiến thức cơ bản về Flowables và khái quát những điều bạn cần biết về chúng. Flowables là một chủ đề khá lớn bao gồm backpressure (áp suất ngược) và various buffering strategies (các chiến lược đệm), tui có để tiếng anh và dịch ra nghĩa gần đúng là như vạiii 😊
Bởi vì đây là bài viết tui muốn giới thiệu cho những bạn mới bắt đầu, cho nên là tui không muốn đi sâu vào các chi tiết phức tạp của Flowables. Tui sẽ đính kèm các tài nguyên ở cuối bài viết này, nơi bạn có thể tìm thêm thông tin về Flowables nếu bạn muốn (mà tui khuyên bạn nên kiểm tra).
Về cơ bản, mục tiêu của bài viết này là cung cấp giải thích về các khái niệm quan trọng nhất liên quan đến Flowables để bạn biết những gì / ở đâu để tìm thêm thông tin
Oke, không lòng vòng nữa, bắt đầu thôi ... 👌👌👌
Flowable là cái vẹo gì??
Flowables đã được giới thiệu trong RxJava2 như một câu trả lời cho một vấn đề. Sự cố liên quan đến một thứ gọi là áp suất ngược (backpressure). Nếu bạn không biết áp suất ngược là gì, đừng lo lắng, tui sẽ nói về điều đó trong phần tiếp theo bên dưới.
Chắc hẳn tui đoán bạn nào đã đọc được dòng này, thì bạn ấy cũng hiểu biết về công nghệ thông tin nói chung và lập trình nói riêng, từ "Nghẽn cổ chai" tui được nghe nhiều đến khi anh em build PC, ví dụ là anh em chọn 1 con Card đồ hoạ RTX 3060 mới nhất, mạnh nhất. Nhưng con CPU lại là con Intel dòng Pentium cùi mía chẳng hạn, như vậy là một điển hình của việc "nghẽn cổ chai", thì ở Flowable ra đời để khắc phục điều đó cho Obsevable, hehe
Về cơ bản trong RxJava2, bạn có hai lớp đối tượng 'Có thể quan sát' thay vì một:
- Observable
- Flowable
Đặc tính phân biệt Observable với Flowable chính là áp suất ngược (
backpressure).
- Observables không nhận biết được áp suất ngược ❌
- Flowables có nhận thức được áp suất ngược ✅
Backpressure (Áp suất ngược, hehe)
From the Rx docs:
Backpressure is when in a Flowable processing pipeline can't process the values fast enough and need a way to tell the upstream producer to slow down.
Giống như nếu bạn có quá nhiều dữ liệu phát ra cho Người quan sát và Người quan sát không thể xử lý nó. Trong những tình huống như vậy, bạn có thể thấy Out Of Memory Exception. Theo nghĩa đen, thiết bị không thể xử lý dữ liệu đến đủ nhanh.
Về áp suất ngược (Backpressure), có một số thuật ngữ bạn nên biết: Hot sources(nguồn nóng) & Cold sources(nguồn lạnh) đại khái tui dịch là vậy.
- Hot sources:
- Hãy coi đây là một push relationship. Các quan sát viên tiếp tục pushing các đối tượng về phía các Quan sát viên bất kể chúng có theo kịp hay không. Về cơ bản các Observables sẽ phát ra các đối tượng và nó tùy thuộc vào Observer để theo kịp.
- Nếu và khi Người quan sát không thể theo kịp các đối tượng phát ra, chúng cần được lưu vào bộ đệm hoặc xử lý theo một cách nào đó. Tui sẽ nói về một số chiến lược đệm (buffering strategies) ở bên dưới.
- Cold sources:
- Điều này ngược lại với các nguồn nóng. Các đối tượng được phát ra bởi các Observables được cho là được phát ra một cách lười biếng(emitted lazily). Ý nghĩa: Observable bắt đầu phát ra các đối tượng khi Người quan sát muốn (Observers) và ở tốc độ phù hợp với Người quan sát (Observer).
- Các đối tượng được phát ra bởi Observables không cần phải được đệm bởi vì toàn bộ quá trình về cơ bản là theo quyết định của Observer.
- Hãy coi đây là một pull relationship. Các Observer kéo các đối tượng từ các Observable khi họ muốn.
Backpressure Strategies
Như tui đã nói trong phần trên, các Hot sources(nguồn nóng) yêu cầu một buffering strategy(chiến lược đệm). Có một số toán tử áp suất ngược mà bạn có thể áp dụng cho Flowable để thực hiện các chiến lược đệm khác nhau.
Chiến lược 1: onBackpressureBuffer ()
Toán tử này giới thiệu một unbounded buffer(bộ đệm không bị ràng buộc) giữa upstream source và downstream operator.
'unbounded' có nghĩa là gì?
"unbounded có nghĩa là miễn là JVM không hết bộ nhớ, nó có thể xử lý hầu hết mọi dung lượng đến từ một bursty source(nguồn bùng nổ)."
Ví dụ:
Ngay cả với 1 triệu số nguyên, điều này sẽ không gây ra Out of Memory Exception.
Other Strategies
Xem bài viết này trên wiki RxJava2 về các chiến lược áp suất ngược và áp suất ngược:
RxJava2 Backpressure.Flowables and Observables
Flowables có thể được chuyển đổi thành Observables và Observables có thể được chuyển đổi thành Flowables.
Observable to Flowable
Khi chuyển đổi một Observable thành Flowable, bạn cần chỉ định chiến lược lưu vào bộ đệm (buffering strategy). Nó khá là nhiều.
Đây là các hằng số chiến lược áp suất ngược. Bạn có thể đọc thêm về chúng trong
RxJava Docs.- BackpressureStrategy.BUFFER
- BackpressureStrategy.DROP
- BackpressureStrategy.ERROR
- BackpressureStrategy.LATEST
- BackpressureStrategy.MISSING
Flowable to Observable
Bạn có thể chuyển đổi một Flowable thành một Observable bằng cách gọi phương thức toObservable () trên Flowable.
Resources
Đăng nhận xét
Cảm ơn bạn đã quan tâm và bày tỏ :D