Reactive,不是一個新議題, 但是在 Cloud Native 時代是愈來愈重要。因為雲原生正是一個大型的分散式系統,會有 backpressure 的等問題,這是 Reactve 要處理的,所以 Quarkus 主打了 Reactive Programming
在 Java 的 Servlet 中,框架分配一個專門 thread 來處理 Request。這個 model 的並發性會受到線程數的限制。此外,一旦程式與外部服務互操作,這些 thread 就會被 block 住了,佔住了 CPU Memory。
可以以餐桌跟服務生作比喻,per request per thread 就像每一個餐桌配給了一個服務生,並且在廚師煮菜的過程中還是一直隨侍在旁,如果是老闆應該會覺得很浪費
而採用 Reactive Programming 就可以一個服務生服務很多桌的客人,對於資源利用更好。
Reactive 最近看到 2017 JCConf 史旺基大大有很好的說明,也有精美的投影片。在 Reactive programming 中,Non-blocking I/O 的操作是很重要的一環。
在容器化的環境,CPU/Memory 是共用的,傳統的 thread 在等待外部的 Daabase, Service 資料回來時, CPU/Memory 是佔住的,對比 NodeJS 的 callback,可能要要佈置更多的 instance 才能面對同等的流量,這很花錢。
Reative 這塊各家會選用不同的實作,Quarkus 則是選擇了 Mutiny, 底層是 vert.x。並且從 RESTful , NoSQL, JDBC, Message Queue 都有支援 reactive 操作的函式庫。以下列出 Quarkus 有支援的 Reactive 的 extension
講了這麼多 Reactive 的好處,那為什麼不是大量流行呢,因為 Reactive progamming 有一定的進入門檻,有各種的 Mono, Flux keyword,要以 functional programming 的方式去思考。但還好我們有 Kotlin coroutines,所以這些都不同管,明天來講講