Golang Adapter Pattern With NATS and Redis Pubsub

Aris Haryanto
3 min readMar 18, 2022

--

Code Kusut

Many people can code, but few people understand patterns…

Well… apa si pattern itu ?

simplenya…. pattern adalah prinsip atau mindset koding yang digunakan untuk mempermudah read dan improvement code

Pernah nga si kalian koding udah cape-cape implementasi sesuatu entah itu API, DB Connection atau Pubsub Implementation trus ketika udah jadi ternyata disuruh ganti misal dari API A ke API B, atau dari sql ke nosql, atau dari Pubsub A ke Pubsub B

naah kalo struktur code kalian kacau kalian akan refactor total dibagian yang connect ke service tadi. kesimpulannya… more effort, more test, more paintfull !!!

itulah tujuan kenapa artikel ini dibuat …
di artikel ini kita akan coba buat adapter pattern untuk pubsub Redis dan NATS
intinya keduanya harus bisa dipanggil dengan fungsi dan param yang sama

Remember !
prinsip adapter pattern adalah kalian hanya perlu ubah bagian initialize dan proses diadapternya, dan untuk proses pemanggilan ke adapternya tetap sama

Sampe sini bingung ??

Siapkan kopi ☕️☕ ️dan izinkan saya menjelaskan lebih detail tentang proses didalamnya.
Saya coba jelasin berdasarkan urutan flow systemnya ya biar lebih mudah dipahami

Pertama di path cmd/main.go disini adalah bagian initialization untuk adapternya. disini kita define service apa yang kita akan gunakan untuk publishnya
contoh disini kita menggunakan Redis dan NATS sebagai pubsubnya

Kedua masih di cmd/main.go turun sedikit function main() kita perlu implement 2 function connection di step pertama tadi ke adapternya, pertama kita harus define struct servicenya.
kemudian kita call function pb.SetAdapter() dengan value dari connection agar struct di service pubsub bisa membaca struct dari adapter yang dipilih.
dibagian pb.Publish() kita pasang go routine supaya dia bisa publish tanpa blocking function berikutnya yaitu pb.Listener()
didalam function pb.Publish() juga ditambah time.Sleep 1 detik ini untuk menunggu function pb.Listener() ready sebelum menerima message

Jika kalian lihat disini kita mempublish dan melisten menggunakan NATS dan Redis dengan fungsi dan param yang sama, param ini bisa kalian ganti sesuai kebutuhan ya misal dijadikan struct{} atau interface{}, untuk contoh kita menggunakan string

(Kedua) Main Process

Ketiga kita masuk ke services/pubsub_service.go dibagian ini kita define interfaces, didalamnya kita define function-function yang ada didalam adapter Publish() dan Listener()
kemudian kita perlu buat function yang sama yang dipanggil dari cmd/main.go di step kedua. didalam function tersebut panggil function Publish() dan Listener() yang ada di adapter

(Ketiga) Pubsub Service

Keempat kita masuk ke adapters/redis_adapter.go kita ambil satu contoh aja untuk penjelasannya ya biar nga kebanyakan karena sebetulnya sama saja antara NATS atau Redis
oke lanjuutt.. kalian liat didalam sini ada 2 function yang sama dengan yang kita define di step ke 3 tadi yaitu Publish() dan Listener() didalamnya kita panggil function dari librarygo-redis untuk Publish() dan Subscribe()

(Keempat) Adapter Service

Thats it !!

kalo kalian mau tambah service adapternya misal mau nambah NSQ atau Kafka, dll, kalian hanya perlu tambahin initialize connectionnya seperti di step pertama kemudian kalian buat adapternya.
Ingat! functionnya harus sama ya ada Publish() dan Listener() karena bakal error kalo nga ada 2 function ini

untuk ganti kalian cukup ubah value SetAdapter() seperti di step pertama

kesimpulannya… adapter pattern ini akan memudahkan kalian jika ada integrasi baru atau perubahan 3rd party vendor atau library kedepannya, jadi code kalian lebih mudah di mainten

gimana ? tertarik buat implement adapter pattern ?….

jangan lupa follow medium saya karena bakal ada artikel artikel baru yang kereeenn….

--

--

Aris Haryanto
Aris Haryanto

Written by Aris Haryanto

Cybersecurity and Software Architect

Responses (1)