0% menganggap dokumen ini bermanfaat (0 suara)
41 tayangan97 halaman

Pengenalan Resilience4J untuk Java

Dokumen ini membahas tentang Resilience4J, yaitu library Java yang digunakan untuk membuat aplikasi lebih tangguh terhadap kegagalan. Resilience4J menyediakan beberapa fitur seperti Circuit Breaker, Retry, Rate Limiter, dan lainnya.

Diunggah oleh

Fajrul Iqbal
Hak Cipta
© All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PPTX, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
41 tayangan97 halaman

Pengenalan Resilience4J untuk Java

Dokumen ini membahas tentang Resilience4J, yaitu library Java yang digunakan untuk membuat aplikasi lebih tangguh terhadap kegagalan. Resilience4J menyediakan beberapa fitur seperti Circuit Breaker, Retry, Rate Limiter, dan lainnya.

Diunggah oleh

Fajrul Iqbal
Hak Cipta
© All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PPTX, PDF, TXT atau baca online di Scribd

Java Resilience4J

Eko Kurniawan Khannedy


Eko Kurniawan Khannedy

- Technical architect at one of the biggest


ecommerce company in Indonesia
- 11+ years experiences
- [Link]
- [Link]/c/ProgrammerZamanNow
Eko Kurniawan Khannedy
● Telegram : @khannedy
● Facebook : [Link]/ProgrammerZamanNow
● Instagram : [Link]/programmerzamannow
● Youtube : [Link]/c/ProgrammerZamanNow
● Telegram Channel : [Link]/ProgrammerZamanNow
● Email : [Link]@[Link]
Sebelum Belajar
● Java OOP
● Apache Maven
● Java Unit Test
● Java Thread
Agenda

● 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

● Retry, mengulangi eksekusi yang gagal


● Circuit Breaker, sementara menolak eksekusi yang memungkinkan gagal
● Rate Limiter, membatasi eksekusi dalam kurun waktu tertentu
● Time Limiter, membatasi durasi eksekusi
● Bulkhead, membatasi eksekusi yang terjadi secara berbarengan
● Cache, mengingat hasil eksekusi yang sukses
● Fallback, menyediakan alternatif hasil dari eksekusi yang gagal
Manfaat Resilience4J

● 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

Pengaturan Default Keterangan

maxAttempts 3 Seberapa banyak retry dilakukan

waitDuration 500 (ms) Waktu menunggu sebelum melakukan retry

ignoreExceptions empty Jenis error yang tidak akan di retry


Kode : Membuat Retry Config
Retry Registry
Retry Registry

● 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

Pengaturan Default Value Keterangan

limitForPeriod 50 Jumlah yang diperbolehkan dalam


periode refresh

limitRefreshPeriod 500 [ns] Durasi refresh, setelah mencapai


waktu refresh, limit akan kembali ke
nol

timeoutDuration 5 [s] Waktu maksimal menunggu rate


limiter
Kode : Rate Limiter Config
Rate Limiter Registry
Rate Limiter Registry

● 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

Pengaturan Default Value Keterangan

maxConcurrentCalls 25 Maksimal eksekusi paralel


yang diperbolehkan

maxWaitDuration 0 Maksimal durasi eksekusi


menunggu bulkhead
Kode : Semaphore Bulkhead Config
Pengaturan Fix Threadpool Bulkhead

Pengaturan Default Value Keterangan

maxThreadPoolSize [Link]() Maksimal thread yang


.availableProcessors() terdapat di pool

coreThreadPoolSize [Link]() Minimal thread awal yag


.availableProcessors() - 1 terdapat di pool

queueCapacity 100 Kapasitas antrian

keepAliveDuration 20 [ms] Lama thread hidup jika


tidak bekerja
Kode : Fix Threadpool Bulkhead
Bulkhead Registry
Bulkhead Registry

● Sama dengan module lainnya, Bulkhead juga memiliki registry


● Baik itu Semaphore Bulkhead, atau Fix Threadpool Bulkhead
Kode : Semaphore Bulkhead Registry
Kode : Fix Threadpool Bulkhead
Time Limiter
Time Limiter

● 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

Pengaturan Default Value Keterangan

timeoutDuration 1s Durasi ekskusi proses ditunggu sampai


dianggap timeout

cancelRunningFuture true Apakah future dibatalkan jika terjadi


timeout
Kode : Time Limiter Config
Time Limiter Registry
Time Limiter Registry

● 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)

Config Default Value Description

failureRateThreshold 50 Minimal persentase error rate agar state


menjadi OPEN

slidingWindowType COUNT_BASED Tipe mode sliding window, count (hitung)


atau time (durasi)

slidingWindowSize 100 Jumlah sliding window yang di record


pada waktu state CLOSED

minimumNumberOfCalls 100 Jumlah minimal eksekusi sebelum error


rate dihitung
Pengaturan Circuit Breaker (2)

Config Default Value Description

waitDurationInOpenState 60000 [ms] Waktu menunggu agar OPEN menjadi


HALF_OPEN

permittedNumberOfCalls 10 Jumlah eksekusi yang diperbolehkan


InHalfOpenState ketika Circuit Breaker pada state
HALF_OPEN

maxWaitDurationInHalfOpe 0 ms Jumlah maksimal menunggu di


nState HALF_OPEN untuk kembali ke OPEN. 0
artinya menugggu tidak terbatas
Pengaturan Circuit Breaker (3)

Config Default Value Description

slowCallDurationThreshold 60000 [ms] Pengaturan sebuah eksekusi dianggap


lambat

slowCallRateThreshold 100 Konfigurasi threshold untuk eksekusi


slow, jika menyentuh threshold, secara
otomatis state akan berubah menjadi
OPEN

ignoreExceptions empty Exception yang tidak akan dianggap


error
Kode : Circuit Breaker Config
Circuit Breaker Registry
Circuit Breaker Registry

● 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

● Semua Registry juga memiliki Event Publisher


● Yang membedakan adalah, Event Publisher di Registry hanya digunakan untuk kejadian seperti
menambah object, menghapus atau mengubah object ke Registry
Kode : Event Publisher di Registry
Integrasi Library Lain
Integrasi Library Lain

● 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

● Java Persistence API


● Java Web

Anda mungkin juga menyukai