Pengenalan Resilience4J untuk Java
Pengenalan Resilience4J untuk Java
● Pengenalan Resilience 4J
● Circuit Breaker
● Bulkhead
● Rate Limiter
● Retry
● Time Limiter
● Fallback
Pengenalan Resilience4J
Reselience4J
● Resilience4j adalah library yang sangat ringan dan mudah digunakan, yang terinspirasi dari library
Netflix Hystrix, namun Resilience4J di desain untuk Java 8 dan pemrograman fungsional
● Ringan, karena library ini hanya membutuhkan satu library, yaitu Vavr (Javaslang), dan tidak
membutuhkan library lainnya
● Resilience4J menyediakan high level feature untuk meningkatkan kemampuan functional
interface, lambda expression dan method reference
● Resilience4J sangat modular
● [Link]
Resilience4J Patterns
● Menjadikan aplikasi yang kita buat lebih tahan terhadap kejadian error yang diluar dugaan
● Memastikan aplikasi kita tidak akan membuat masalah untuk aplikasi lain ketika saling terintegrasi
Membuat Project
Membuat Project
[Link]
Menambah Dependency
Retry
Retry
● Retry merupakan module di Resilience4J yang bisa kita gunakan untuk mencoba melakukan
eksekusi kode secara berulang dalam jumlah yang sudah ditentukan
● Penggunaan Retry bisa mempermudah kita ketika misal akan mengeksekusi kode yang bisa
memungkinkan gagal, dan kita ingin mengulanginya lagi, tanpa harus menggunakan perulangan
secara manual
● Implementasi dari module ini adalah sebuah interface bernama Retry
Kode : Membuat Retry
Execute
● Konsep Resilience4J adalah membungkus functional interface atau lambda yang kita buat, yang
secara otomatis akan menghasilkan object lainnya yang sudah dibungkus dengan module
Resilience4J
● Ketika kita coba mengeksekusi object hasil nya tersebut, maka fitur Resilience4J secara otomoatis
akan digunakan pada object tersebut
Kode : Execute Runnable
Kode : Execute Supplier
Retry Config
Retry Config
● Saat kita membuat Retry menggunakan [Link](), secara otomatis kita akan
menggunakan pengaturan default
● Kadang pada kasus tertentu, kita ingin menentukan pengaturan untuk Retry secara manual, misal
menentukan jumlah retry nya misalnya
● Kita bisa membuat object RetryConfig sebelum membuat object Retry
Pengaturan Retry
● Saat kita belajar Java Database, kita mengenal yang namanya Database Pooling, yaitu tempat
untuk menyimpan semua koneksi database
● Resilience4J juga mengenal konsep ini, namun namanya adalah Registry
● Registry adalah tempat untuk menyimpan object-object dari Resilience4J
● Dengan menggunakan Registry, secara otomatis kita bisa menggunakan ulang object yang sudah
kita buat, tanpa harus membuat ulang object baru
● Penggunaan Registry adalah salah satu best practice yang direkomendasikan ketika menggunakan
Resilience4J
Kode : Membuat Retry dari Registry
Config di Registry
● Salah satu hal yang menarik di Retry Registry, kita bisa menambahkan default config atau
menambahkan config yang sama dengan nama Retry nya
● Jika saat membuat Retry kita tidak menyebutkan nama config nya, secara otomatis akan
menggunakan default config
Kode : Config di Retry Registry
Rate Limiter
Rate Limiter
● Rate Limiter merupakan module di Resilience4J yang bisa digunakan untuk membatasi jumlah
eksekusi pada waktu tertentu
● Rate Limiter sering sekali digunakan ketika misal kita tidak ingin terlalu banyak request yang
diterima untuk menjalankan sebuah kode program, dengan demikian kita bisa memastikan
program kita tidak terbebani terlalu berat
● Jika request sudah melebihi batas waktu yang sudah ditentukan, secara otomatis Rate Limiter
akan menjadikan request tersebut error dengan exception RequestNotPermitted
Kode : Rate Limiter
Kenapa Tidak Error?
● Karena default nya pengaturan yang diperbolehkan di RateLimiter adalah 50 per 500ns (nano
second)
● Kita akan bahas pengaturan Rate Limiter di materi selanjutnya
Rate Limiter Config
Rate Limiter Config
● Rate Limiter memiliki config yang bisa kita atur sesuai dengan kebutuhan kita
● Kita bisa membuat config menggunakan RateLimiterConfig
Pengaturan Rate Limiter
● Sama seperti Retry, Rate Limiter pun memiliki Registry untuk melakukan management object Rate
Limiter
● Dan sebaiknya saat membuat aplikasi, kita menggunakan Registry untuk melakukan manajemen
object Rate Limiter nya
Kode : Rate Limiter Registry
Bulkhead
Bulkhead
● Resilience4J memiliki module untuk menjaga jumlah eksekusi concurrent menggunakan Bulkhead
● Terdapat dua implementasi Bulkhead di Resilience4J :
○ Semaphore
○ Fix Threadpool
● Jika Bulkhead sudah penuh, secara otomatis Bulkhead akan mengembalikan error
BulkheadFullException ketika kita meminta eksekusi
Kode : Semaphore Bulkhead
Kode : Threadpool Bulkhead
Bulkhead Config
Bulkhead Config
● Sama seperti module lainnya, kita juga bisa melakukan pengaturan untuk Bulkhead
● Namun pengaturannya disesuaikan dengan implementasi Bulkhead yang kita gunakan, baik itu
Semaphore atau Fix Threadpool
Pengaturan Semaphore Bulkhead
● Time Limiter merupakan module di Resilience4J yang digunakan untuk membatasi durasi dari
sebuah eksekusi kode program
● Dengan Time Limiter, kita bisa menentukan berapa maksimal durasi eksekusi sebuah kode
program, jika melebihi yang sudah ditentukan, secara otomatis eksekusi tersebut akan dibatalkan
dan akan terjadi error
● Time Limiter membutuhkan eksekusi dalam bentuk Future atau Completable Future
Kode : Time Limiter
Kode : Slow Function
Time Limiter Config
Time Limiter Config
● Secara default, Time Limiter akan menunggu sekitar 1 detik sampai dianggap timeout
● Namun kita juga bisa mengubah pengaturan nya, dengan menggunakan Time Limiter Config
Pengaturan Time Limiter
● Sama dengan module lainnya, Time Limiter juga memiliki Registry untuk menyimpan object Time
Limiter
Kode : Time Limiter Registry
Circuit Breaker
Circuit Breaker
● Circuit Breaker adalah implementasi dari finite state machine, dengan tiga normal state: CLOSED,
OPEN dan HALF_OPEN, dan dua spesial state DISABLED dan FORCED_OPEN.
● Kita bisa memilih menggunakan Circuit Breaker berbasis hitungan atau waktu
● Basis hitungan berarti menghitung data berdasarkan jumlah N eksekusi terakhir
● Basis waktu berarti menghitung data berdasarkan jumlah eksekusi dalam N detik terakhir
Diagram: Circuit Breaker
Kode : Circuit Breaker
Circuit Breaker Config
Circuit Breaker Config
● Secara default, Circuit Breaker akan mencoba menghitung jumlah error rate setelah 100 kali
eksekusi
● Dan jika terjadi error diatas 50%, maka Circuit Breaker akan menjadi state OPEN, dan otomatis
semua request akan ditolak dengan error CallNotPermittedException
Circuit Breaker Config Mode
● Saat kita membuat Circuit Breaker, kita bisa mengubah mode pengaturan berbasis hitungan atau
waktu, defaultnya adalah menggunakan hitungan dengan jumlah minimal 100
● Kita juga bisa mengubahnya menjadi mode waktu, sehingga error rate dihitung berdasarkan durasi
waktu
● Ada banyak sekali pengaturan yang bisa kita ubah pada Circuit Breaker
Pengaturan Circuit Breaker (1)
● Sama seperti module lainnya, Circuit Breaker juga memiliki Registry untuk melakukan
management object Circuit Breaker nya
Kode : Circuit Breaker Registry
Decorators
Decorators
● Pada kasus tertentu, kadang kita ingin menggabungkan beberapa module di Resilience4J secara
sekaligus
● Misal kita ingin menggabungkan Circuit Breaker dan Retry
● Resilience4J menyediakan module tambahan bernama Decorators, dimana kita bisa
menggabungkan beberapa module secara bersamaan
● Namun sampai saat ini, Decorators belum bisa untuk menggabungkan module Time Limiter
Kode : Decorators (1)
Kode : Decorators (2)
Fallback
Fallback
● Untuk kasus dimana functional interface nya bisa mengembalikan value, maka kita bisa
menambah fallback di dalam Decorators
● Artinya, jika ternyata terjadi error ketika melakukan eksekusi, maka secara otomatis function
fallback akan dipanggil
Kode : Fallback
Metric
Metric
● Hampir semua module di Resilience4J memiliki fitur Metric, dimana kita bisa melihat data metric
dari object yang sedang kita gunakan
● Contohnya di Retry, kita bisa mendapatkan Metric data seberapa banyak eksekusi yang sukses
dan gagal misalnya
Kode : Metric
Event Publisher
Event Publisher
● Semua module di Resilience4J memiliki fitur yang namanya adalah Event Publisher
● Fitur ini digunakan untuk mengirim event kejadian ketika suatu kejadian terjadi
● Contoh, kita bisa mendapatkan event ketika misal di Retry terjadi kejadian Sukses, Error atau
Retry
● Untuk mendapatkan Event Publisher object, kita bisa menggunakan getEventPublisher() di object
seperti Retry, CircuitBreaker, RateLimiter, dan lain-lain
Kode : Event Publisher
Event Publisher di Registry
Event Publisher di Registry
● Resilience4J sangat flexible untuk diintegrasikan dengan library lain, hal ini menyebabkan
Resilience4J sangat disukai oleh para programmer Java
● Kotlin : [Link]
● RxJava : [Link]
● Project Reactor : [Link]
● Spring Boot : [Link]
● Micrometer : [Link]
Materi Selanjutnya
Materi Selanjutnya