Published on

Message Broker dengan Redis List

Authors

Overview

Redis Lists salah satu fitur yang dapat digunakan untuk menerapkan konsep message broker. karena terdapat operasi BLOP dan BROP, yang mengijinkan aplikasi untuk menunggu dengan durasi tertentu jika list dalam kondisi kosong. Setelah sebuah item ditambahkan ke dalam list melalui LPUSH dari aplikasi lain, pesan akan di diterima dan diolah secara langsung. Proses decoupling menerapkan konsep asyncronous dan event-driven arsitektur dan sering merujuk pada model worker queue pattern dimana redis list bertindak sebagai queue.

Producers mengelompokan antrian dengan item, dan worker aplikasi (atau consumer) dequeue dan memproses pesan tersebut. dengan melakukan utilisasi Redis Lists dan operasi blocking, developer dapat membuat sistem secara efisien dan scalable untuk task terdistribusi, antrian pesan, dan backgroun job processing.

Implementasi

Berikut contoh demontrasi menggunakan Redis List sebagai job processing queue

package main

import (
	"context"
	"errors"
	"fmt"
	"log"
	"time"

	"github.com/redis/go-redis/v9"
)

const listName = "lists"

func main() {
	fmt.Println("list consumer application started")

	client := redis.NewClient(&redis.Options{Addr: "localhost:6379"})
	_, err := client.Ping(context.Background()).Result()

	if err != nil {
		log.Fatal("failed to connect", err)
	}
	for {
		data, err := client.BRPop(context.Background(), 2*time.Second, listName).Result()
		if err != nil {
			if errors.Is(err, redis.Nil) {
				continue
			}
			log.Println("brpop operation failed", err)
		}

		fmt.Println("received data from list -", data[1])
	}
}

Sebelum menajalankan program mari breakdown alurnya:

  • Perulangan akan memulai menconsume data dari redis list
  • didalam perulangan BRPop adalah sebuah fungsi yang digunakan untuk block dan wait tersedianya elemen data yang akan di keluarkan dari redis list. itu membutuhkan context dan timeout duration, setalah itu nama dari list. jika tidak adal elemen dalam waktu timeout, command akan mengembalika redis.Nil error.
  • BRPop mengembalikan slice elemen pertama adalah adlah list dan kedua adalah elemen data.

untuk menjalankan program diatas

go run main.go

untuk produce message menggunakan cli

docker exec -it redis redis-cli -a "password" lpush lists user1
docker exec -it redis redis-cli -a "password" lpush lists user2
docker exec -it redis redis-cli -a "password" lpush lists user3

Output

output-redis-list