Tutorial Membuat Sistem Notifikasi dengan Redistribusi Pub/Sub di Golang

Tutorial Membuat Sistem Notifikasi dengan Redistribusi Pub/Sub di Golang

id9 min read • 751 views

Tutorial Membuat Sistem Notifikasi dengan Redistribusi Pub/Sub di Golang

Tutorial Membuat Sistem Notifikasi dengan Redistribusi Pub/Sub di Golang

Membangun sebuah sistem notifikasi yang andal dan real-time adalah kebutuhan yang semakin sering ditemui dalam pengembangan aplikasi modern. Notifikasi ini diperlukan untuk berbagai keperluan, seperti menginformasikan pengguna tentang pesan baru, update produk, atau peringatan penting lainnya. Salah satu tantangan yang sering dihadapi oleh para developer adalah bagaimana cara mengirim notifikasi secara real-time ke banyak pengguna tanpa menyebabkan bottleneck dalam sistem.

Salah satu solusi yang dapat digunakan adalah dengan memanfaatkan Redis, khususnya fitur *Publish/Subscribe* (Pub/Sub) yang disediakan oleh Redis. Redis Pub/Sub memungkinkan kita untuk mengirim pesan ke banyak klien secara efisien, tanpa harus membangun infrastruktur komunikasi yang rumit. Pada tutorial kali ini, kita akan membahas cara membuat sistem notifikasi sederhana dengan Redis Pub/Sub menggunakan bahasa pemrograman Golang. Dengan implementasi ini, sistem notifikasi akan bekerja secara asinkron dan real-time, sehingga pengguna dapat menerima pesan saat itu juga tanpa harus me-refresh halaman atau melakukan polling ke server secara berkala.

Mari kita mulai langkah demi langkah pembuatan sistem notifikasi ini.

Step 1 - Persiapan dan Setup Project

Langkah pertama dalam membuat sistem ini adalah menyiapkan proyek Golang dari awal. Proyek ini akan menggunakan beberapa dependensi penting, tetapi jangan khawatir, karena semuanya bisa kita atur dengan mudah.

  • Membuat Project Baru

Pertama, buat sebuah folder untuk menampung proyek yang akan kita kerjakan. Anda dapat memberi nama folder tersebut sesuai keinginan, misalnya `pubsub-go`. Setelah itu, buka terminal atau command prompt, dan jalankan perintah berikut untuk membuat folder dan masuk ke dalamnya:

```bash
mkdir pubsub-go
cd pubsub-go
```

Kemudian, inisialisasi proyek Golang dengan perintah berikut:

```bash
go mod init pub-sub-go
```

Perintah ini akan membuat dua file, yaitu `go.mod` dan `go.sum`, yang berfungsi untuk mengelola informasi proyek dan dependensi yang dibutuhkan.

 

  • Menginstall Dependency yang Dibutuhkan

Agar proyek ini bisa berjalan, kita membutuhkan beberapa library pihak ketiga, antara lain:

  • Fiber sebagai framework web yang cepat dan minimalis.
  • Redis Go Client untuk berkomunikasi dengan Redis server.
  • Fasthttp untuk mendukung *Server-Sent Events* (SSE).

Jalankan perintah berikut untuk menginstall semua dependensi tersebut:

```bash
go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/template/html/v2
go get -u github.com/redis/go-redis/v9
go get -u github.com/valyala/fasthttp
```

Setelah selesai, proyek Anda sudah siap untuk dikembangkan lebih lanjut.

Baca Juga

 

Step 2 - Setup Redis

Redis adalah sistem penyimpanan data yang sangat cepat, dan dalam konteks tutorial ini, Redis akan kita gunakan sebagai server untuk mengelola mekanisme Pub/Sub. Redis sangat mudah diatur dan bisa diinstal dengan beberapa cara, seperti menggunakan Docker atau menginstall langsung ke sistem operasi yang Anda gunakan.

  • Menginstall Redis dengan Docker

Di tutorial ini, kita akan menggunakan Docker untuk menjalankan Redis. Docker memudahkan kita untuk menjalankan Redis tanpa perlu khawatir tentang proses instalasi yang rumit atau konfigurasi sistem operasi. Buatlah file bernama `docker-compose.yml` di root direktori proyek Anda, kemudian isi dengan konfigurasi berikut:

```yaml
version: "3.9"


services:
  redis:
    image: redis
    container_name: pubsubgo-redis
    ports:
      - 6379:6379
    volumes:
      - ./_docker-data/redis:/data
```

Konfigurasi ini akan membuat container Redis yang berjalan di port 6379. Volume Redis akan disimpan di direktori `_docker-data` agar terisolasi dari proyek Golang Anda. Setelah file tersebut dibuat, jalankan perintah berikut untuk menjalankan Redis di Docker:

```bash
docker-compose up -d
```

Redis sekarang sudah siap digunakan dan bisa diakses di port 6379.

 

Step 3 - Menyambungkan Aplikasi dengan Redis

Setelah Redis berhasil berjalan, langkah selanjutnya adalah menghubungkan aplikasi Golang kita dengan Redis. Buatlah sebuah file baru di dalam folder `configs/` bernama `redis.go`, lalu isi dengan kode berikut:

```go
package configs


import (
  "context"
  "github.com/redis/go-redis/v9"
)


const (
  REDIS_CHANNEL_NOTIFICATION = `notification`
)


var RDS *redis.Client
var RDS_CTX context.Context


func InitRedisClient() {
  RDS_CTX = context.Background()
  RDS = redis.NewClient(&redis.Options{
    Addr:     `localhost:6379`,
    Password: ``,
    DB:       0,
  })
}
```

Kode di atas mendefinisikan sebuah fungsi untuk menginisialisasi klien Redis dan menyambungkannya ke server Redis yang berjalan di localhost. Variabel `RDS` menyimpan koneksi klien Redis yang akan kita gunakan di seluruh aplikasi, sedangkan `RDS_CTX` adalah context yang diperlukan untuk operasi asinkron.

Lalu, tes koneksi Redis dengan memanggil fungsi `InitRedisClient` di file `main.go`:

```go
package main


import (
  "fmt"
  "pub-sub-go/configs"
)


func main() {
  configs.InitRedisClient()


  err := configs.RDS.Ping(configs.RDS_CTX).Err()
  if err != nil {
    fmt.Println(`failed to connect redis`)
    panic(err)
  } else {
    fmt.Println(`connect to redis successfully!`)
  }
}
```

Jalankan aplikasi dengan perintah berikut untuk memeriksa apakah koneksi Redis berhasil:

```bash
go run main.go
```

Jika berhasil, Anda akan melihat pesan `connect to redis successfully!` di terminal.

 

Step 4 - Membuat Controller

Pada langkah ini, kita akan membuat dua endpoint di aplikasi: satu untuk menampilkan halaman web, dan satu lagi untuk menerima notifikasi secara real-time. Keduanya akan memanfaatkan mekanisme Pub/Sub dari Redis.

Pertama, mari kita buat handler untuk halaman utama di `controller/home.go`:

```go
package controller


import (
  "fmt"
  "log"
  "pub-sub-go/configs"


  "github.com/gofiber/fiber/v2"
)


func HomePage(c *fiber.Ctx) error {
  message := fmt.Sprintf("User dengan IP %v mengakses website", c.IP())
  err := configs.RDS.Publish(
    configs.RDS_CTX,
    configs.REDIS_CHANNEL_NOTIFICATION,
    message,
  ).Err()


  if err != nil {
    log.Println(`Error:`, err)
  }


  return c.Render(`index`, fiber.Map{})
}
```

Fungsi ini akan mem-publish pesan ke Redis setiap kali pengguna mengakses halaman utama, dan menampilkan halaman web dari file `index.html`.

 

Step 5 - Membuat Tampilan Web

Untuk menampilkan notifikasi, kita akan membuat halaman web sederhana di `views/index.html`. Isi file ini dengan kode berikut:

```html
<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Notifikasi Real-time</title>
</head>
<body>
  <h1>Notifikasi</h1>
  <div id="result"></div>


  <script>
    if (typeof(EventSource) !== "undefined") {
      const source = new EventSource("/notification");
      source.onmessage = function(event) {
        document.getElementById("result").innerHTML += `<p style="margin: 0">` + event.data + `</p>`;
      };
    } else {
      document.getElementById("result").innerHTML = "Maaf, browser anda tidak mendukung SSE.";
    }
  </script>
</body>
</html>
```

 

Step 6 - Mengirim dan Menerima Notifikasi

Untuk mengirim notifikasi secara real-time, kita akan menggunakan teknologi Server-Sent Events (SSE). SSE memungkinkan server mengirim data secara kontinu ke browser. Buat file `controller/notification.go`:

```go
package controller


import (
  "bufio"
  "fmt"
  "log"
  "pub-sub-go/configs"


  "github.com/gofiber/fiber/v2"
  "github.com/valyala/fasthttp"
)


func Notification(c *fiber.Ctx) error {
  c.Set("Content-Type", "text/event-stream")
  c.Set("Cache-Control", "no-cache")
  c.Set("Connection", "keep-alive")


  c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
    pubSub := configs.RDS.Subscribe(configs.RDS_CTX, configs.REDIS_CHANNEL_NOTIFICATION)
    defer pubSub.Close()


    for {
      msg, err := pubSub.ReceiveMessage(configs.RDS_CTX)
      if err != nil {
        log.Println(`pubSub.ReceiveMessage(CTX)`, err)
      } else {
        log.Println(`message:`, msg.Payload)
      }


      fmt.Fprintf(w, "data: %s\n\n", msg.Payload)
      err = w.Flush()
      if err != nil {
        fmt.Printf("Error while flushing: %v. Closing http connection.\n", err)
        break
      }
    }
  }))


  return nil
}
```

Endpoint ini akan menampilkan pesan notifikasi secara real-time ke pengguna yang terhubung.

 

Kesimpulan

Dengan implementasi Redis Pub/Sub dan SSE di Golang, kita telah berhasil membangun sistem notifikasi real-time yang efisien dan mudah diimplementasikan.

Series: Programming And Coding
  1. Skill-Skill Yang Perlu Dimiliki Programer
  2. Sejarah Terciptanya Bahasa Pemrograman Java
  3. 4 Manfaat Coding Untuk Anak
  4. 4 Roadmap Untuk Jadi Programer
  5. Macam Profesi IT Paling Dicari Tahun 2024
  6. Skill-Skill Yang Perlu Dipelajari Insinyur AI
  7. Rekomendasi 4 Aplikasi Coding Via Komputer
  8. Review Aplikasi Coding Notepad++
  9. Revolutionize Code Generation with programming-helper/generate-function
  10. 4 Contoh Koding Untuk Website Bisnis Online
  11. Rekomendasi 4 Tool IDE Untuk Pengembangan Web
  12. 4 Jobdesk Utama Seorang Front End Developer
  13. Memahami Jenis Error yang Sering Terjadi Saat Koding
  14. Cara Install serta Setup Unity Engine di Mac dengan Baik dan Benar
  15. Skill-Skill Yang Harus Dikuasai Back End Developer
  16. Skill Yang Dipelajari Seorang Front End Developer
  17. Tugas-tugas Yang Di Emban Back End Developer
  18. Top 4 Bahasa Pemrograman Untuk Membuat Kecerdasan Buatan
  19. 4 Alasan Javascript Perlu Dipelajari Programmer
  20. 4 Tantangan Yang Harus Dihadapi Programmer
  21. 4 Alternatif AI Coding Selain ChatGPT
  22. 4 Bahasa Pemrograman Tersulit Dipelajari
  23. Menguak Teknologi di Balik Speech Recognition: Bagaimana Mesin Memahami Ucapan
  24. Coding 101 : Sejarah Perkembangan Phyton
  25. Serba-serbi Bahasa Pemrograman C
  26. 5 Manfaat Test dan Debugging Saat Membuat Aplikasi
  27. 6 Tips Memilih Laptop Untuk Keperluan Coding
  28. 6 Alasan Kenapa Linux Banyak Digunakan Untuk Coding
  29. 6 Ciri Kamu Mengalami Overwhelmed saat Belajar Bahasa Pemrograman
  30. 5 Perbedaan Call By Reference dan Call By Value dalam Pemrograman
  31. Tutorial Persiapan Pemrograman C Di Linux
  32. Memahami Struktur Dasar dan Aturan Penulisan Program C
  33. Belajar Pemrograman C : Mengenal Fungsi Input dan Output pada C
  34. Belajar Pemrograman C #05: Mengenal Variabel, Tipe Data, Dan Konstanta
  35. 6 Bahasa Coding Yang Cocok Untuk Pengembangan Aplikasi Mobile
  36. 6 Manfaat Coding HTML dalam Dunia IT
  37. 6 Manfaat Belajar Coding C Untuk Programmer Pemula
  38. Mengenal Lima Tipe Data yang Umum Digunakan dalam Pemrograman
  39. 6 Tips Coding Laravel Yang Belum Diketahui Banyak Orang
  40. 6 Tips dan Trik Coding Java untuk Pengembang Baru
  41. 5 Teknik Pengoptimalan Kode C untuk Performa Maksimal
  42. 6 Tantangan Pemrograman C yang Dapat Mengasah Keterampilan Anda
  43. 7 Pustaka Laravel yang Membantu Mempercepat Pengembangan Aplikasi
  44. 6 Tips Coding HTML yang Jarang Diketahui Orang
  45. 7 Perbedaan Utama Antara C dan C++ yang Harus Anda Ketahui
  46. 5 Proyek Sederhana untuk Menguasai Bahasa Pemrograman C
  47. 6 Contoh Operator Pada Bahasa Pemrograman C
  48. 6 Bentuk Blok Percabangan Pada Pemrograman C
  49. 6 Cara Proyek Yang Bisa Dibuat Sebagai Portofolio Coding
  50. 6 Tips Efektif Belajar Bahasa Pemrograman Secara Otodidak
  51. Mengenal Tipe Data Enum pada C
  52. 5 Jenis Fungsi dalam Bahasa C yang Wajib Kamu Tahu
  53. Mengenal Struktur Data Array pada C
  54. 6 Alasan Pentingnya Membuat Portofolio Coding Bagi Programmer
  55. 4 Jenis Blok Perulangan Pada Bahasa Pemrograman C
  56. 6 Perbedaan Front End dan Back End Programmer
  57. 6 Platform Untuk Membagikan Portofolio Coding Bagi Programmer
  58. 7 Contoh Coding Sederhana dengan SQL untuk Mengelola Database
  59. 6 Kegunaan Bahasa Pemrograman Git yang Perlu Diketahui
  60. 7 Perintah Git yang Wajib Diketahui Setiap Developer
  61. Tutorial Git 1 : Pengenalan
  62. Tutorial Git 2 : Installasi
  63. Tutorial Git #3: Simpan Perubahan Revisi dengan Git Commit
  64. 5 Alasan Programmer Harus Selalu Update Kemampuan Coding
  65. 6 Jenis Operator Pada Pemrograman C
  66. 4 Bentuk Blok Perulangan Pada Pemrograman C
  67. Tutorial Membuat Sistem Notifikasi dengan Redistribusi Pub/Sub di Golang
  68. 6 Tips Memulai Karier Sebagai Junior Programmer
  69. 6 Proyek Open-Source yang Dibangun dengan Ruby
  70. 6 Fakta Menarik Bahasa Pemrograman Ruby
  71. 6 Keterkaitan Bahasa Pemrograman dan Ilmu Matematika
  72. Rekomendasi 5 Game Gratis Untuk Belajar Coding
  73. 6 Jasa Freelance Yang Bisa Ditawarkan Programmer
  74. Tutorial Git #4: Melihat Catatan Log Revisi
  75. Tutorial Git #5: Melihat Perbandingan Revisi Dengan Git Diff
  76. Tutorial Git #6: Perintah untuk Membatalkan Revisi
  77. Tutorial Git #7: Menggunakan Percabangan Untuk Mencegah Konflik
  78. 6 Tools yang Paling Efektif Saat Digunakan Bersama Jenkins
  79. 6 Paket NPM Paling Populer untuk Pengembangan Node.js
  80. Perbandingan: Otodidak VS Bootcamp dalam Belajar Coding
  81. 5 Langkah Mudah Memulai Pemrograman SQL bagi Pemula Data Science
  82. Kenapa Belajar Coding Meningkatkan Kemampuan Problem Solving
  83. Tutorial Git #8: Perbedaan Git Checkout, Git Reset, Dan Git Revert
  84. Tutorial Git #9: Bekerja dengan Remote Repositori
  85. Pentingnya GitHub untuk Para Pembuat Program
  86. Berapa Gaji Programmer di Indonesia?
  87. Istilah-Istilah Bahasa Pemrograman yang Perlu Diketahui Pemula
  88. Cara Berkontribusi di Proyek Open Source
  89. 6 Manfaat Gabung Komunitas Coding Bagi Programmer Pemula
  90. 6 Perintah Git Lanjutan untuk Developer Berpengalaman
  91. Indikasi Menjadi Programmer Hebat: Kunci dan Ciri-Ciri yang Perlu Dikembangkan
  92. Perbedaan Pass by Value dan Pass by Reference di C: 5 Hal yang Harus Dipahami
  93. Memahami Union dalam C++: Pengertian, Aturan, dan Contoh Penerapannya
  94. 3 Komponen Kunci dalam Routing Aplikasi Web: Routes, Router, dan Prosesnya
  95. 5 Rekomendasi API untuk Pengembangan Aplikasi E-Commerce
  96. 5 Jenis API yang Harus Diketahui Developer: REST, SOAP, dan Lainnya
  97. Testing dan Debugging: Keterampilan Penting untuk Setiap Programmer Profesional
  98. 5 Rekomendasi Tools SQL Editor Terbaik untuk Programmer: Versi Lengkap dan Mendalam
  99. Tutorial GIT 11 : Bagaimana Cara Berkontribusi Di Project Open Source Via GIT
  100. Panduan Lengkap Pakai Git di Visual Studio Code: Gampang Banget, Bos!
  101. 6 Trik Jahil Programmer Saat Ngoding: Bikin Coding Jadi Seru (Tapi Tetap Produktif)
  102. 5 Tips Memilih Mentor Programmer yang Berkualitas: Jangan Sampai Salah Pilih, Bro!
  103. Aspek-Aspek Coding untuk Peningkatan User Interface (UI)
Published on October 05, 2024
Last updated on February 12, 2025

If you like this post and want to support us, you can support us via buymeacoffee or trakteer.