在 Java 這邊有很多 Reactive 的 framework, 早期有 RxJava, Spring 的選擇是 Reactor, Quarkus 的選擇是 Mutiny. 是說剛剛查了一下 Mutiny 是兵變(官兵叛變)的意思 ...
所以 Quarkus 說你要用 Reactive 有兩種方法 1) Mutiny 2) Coroutines
所以我們會用 Coroutines 來幫助我們更簡單的寫出 reactive 的程式碼。不過要說的,不能因為 Kotlin 把這件事看起來變的簡單就對非同步的背景知識輕忽,reactive 的水還是滿深的。
Quarkus 對 Coroutines 支援,底層也是利用了 Mutiny,把 Blocking IO 的操作丟去 Vertx 的 pool
目前有以下的接口 extension 支援 suspend 的 function
Extension | Comments |
---|---|
quarkus-resteasy-reactive | RESTful 支援 |
quarkus-rest-client-reactive | REST Client |
quarkus-smallrye-reactive-messaging | Reactive message |
quarkus-scheduler | 排程 |
quarkus-smallrye-fault-tolerance | Retry, timeout 等 Annotation |
從接口進來的 suspend function 開始,就要一直往後 call suspend function,依 cloud native 的特性就會要接去外部服務, Quarkus 利用 Mutiny 提供很多外部 Service Reactive 的實現。這些 Reactive return 都會是 Uni<T>
或是 Multi<T>
的封裝。
在 Kotlin 這邊, Mutiny 提供了 awaitSuspending 的方法,可以直接把 Uni<T>
轉成 suspend <T>
這樣我們就可以無縫接軌,從前到後都是 suspend function。
例如今天我們想用 Panache Reactive ORM 處理 RDB delete, 只要這樣
suspend fun deleteEntry(forecastId: Int) {
Panache.withTransaction { delete("forecastId", forecastId) }.awaitSuspending()
}