Skip to content

lishank0119/pubsub

Repository files navigation

Go Reference go.mod

PubSub System

中文

A lightweight internal Publish/Subscribe (Pub/Sub) system written in Go, designed for efficient message broadcasting with flexible subscription management.

🚀 Features

  • Topic-Based Messaging: Subscribers can subscribe to specific topics.
  • Efficient Message Handling: Uses a centralized publish message channel for optimized message dispatch.
  • Flexible Subscription Control: Supports subscribing, unsubscribing from specific topics, and bulk unsubscription.
  • Thread-Safe: Built-in synchronization for concurrent operations.
  • Topic Introspection: Supports ListTopics() and SubscriberCount() for monitoring active topics.

📦 Installation

go get -u github.com/lishank0119/pubsub

🔍 Topic Monitoring

You can inspect current topics and subscriptions:

topics := ps.ListTopics() // returns []string
count := ps.SubscriberCount("news") // returns int

⚡ Usage

Code

package main

import (
  "fmt"
  "github.com/lishank0119/pubsub"
  "time"
)

func main() {
  ps := pubsub.NewPubSub(nil)
  subscriber := ps.NewSubscriber()

  go Publish(ps)

  subscriber.Subscribe("news", func(msg []byte) {
    fmt.Println("Received:", string(msg))
  })

  subscriber.Subscribe("news:2", func(msg []byte) {
    fmt.Println("Received(2):", string(msg))
  })

  time.Sleep(1500 * time.Millisecond)

  subscriber.Unsubscribe("news:2")

  time.Sleep(1 * time.Second)

  subscriber.UnsubscribeAll()

  select {}
}

func Publish(ps *pubsub.PubSub) {
  IntervalTime := 1 * time.Second
  ticker := time.NewTicker(IntervalTime)
  for {
    select {
    case <-ticker.C:
      if err := ps.Publish("news", []byte("Hello, PubSub World!")); err != nil {
        panic(err)
        return
      }

      if err := ps.Publish("news:2", []byte("Hello, PubSub World!(2)")); err != nil {
        panic(err)
        return
      }
    }
  }
}

Subscription Management

  • Subscribe to a Topic:

    subscriber.Subscribe("topic", handlerFunc)
  • Unsubscribe from a Topic:

    subscriber.Unsubscribe("topic")
  • Unsubscribe from All Topics:

    subscriber.UnsubscribeAll()
  • Global Unsubscribe for a Topic:

    ps.UnsubscribeTopic("topic")

✅ Running Tests

go test -v

📄 License

This project is licensed under the MIT License.

About

A lightweight internal Publish/Subscribe (Pub/Sub) system written in Go.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages