notify

Broadcast csatorna

A realtime broadcast notification csatorna.

Ez az alcsomag adja a notify élő push-csatornáját: importáld, amikor egy notificationnek azonnal, kapcsolódó kliensekhez kell eljutnia, a database-csatorna tartósságán túl vagy helyett.

import "github.com/gp-system/notify/broadcast"

Broadcast

A notify/broadcast egy notification élő push-oldala: egy vékony, Valkey-alapú publisher, ami a centrifugal/centrifuge-re épül, a Centrifugo és a Grafana Live mögötti libraryre. Szándékosan kicsi: a publikálás fire-and-forget, a durability teljes egészében a database csatornában él, nem itt. A csomagot két szerep osztja meg: bármely process (jellemzően a worker) csak azért importálja, hogy publikáljon, míg a dedikált realtime gateway is ezt használja a kapcsolatok tartására és a publikáltak relay-elésére; a gateway-oldalért lásd azt az oldalt (cmd/realtime, skálázás, kliens).

Egy notification egy harmadik tartalom-interfészen keresztül iratkozik fel erre a csatornára, a Mailable és a Databasable mellett:

type Broadcastable interface {
    ToBroadcast(ctx context.Context, r Recipient) (broadcast.Message, error)
}

ValkeyConfig

type ValkeyConfig struct {
    Addr     string
    Password string
    DB       int
}

A ValkeyConfig szándékosan nem hordoz saját env-tageket: a notify/broadcast egy library, nem egy hely, ahol egy env-névteret birtokolna. A realtime chassis a saját VALKEY_*-taggelt configjából épít egyet, és azt adja át (realtime.Config.BroadcastValkey()); egy nem-chassis publisher ugyanezt teszi, bármilyen configból, ami már megvan neki. A pontos mappelésért lásd a Realtime oldalt.

Config

type Config struct {
    ChannelPrefix string `env:"CHANNEL_PREFIX" envDefault:"rt"`
}

A ValkeyConfig-gal ellentétben a Config igen hordoz saját env-taget (CHANNEL_PREFIX). A kit a saját REALTIME_ prefixe alá ágyazza, így egy generált projektben REALTIME_CHANNEL_PREFIX-ként jelenik meg; lásd a Realtime oldalt és a konfiguráció-referenciát a teljes változólistáért. A ChannelPrefix névterezi minden Valkey-csatornát, amihez ez a csomag hozzáér, így több projekt (vagy több környezet) megoszthat egy Valkey-instance-t ütközés nélkül.

Publikálás

pub, err := broadcast.NewPublisher(ctx, valkeyCfg, cfg)
pub := broadcast.MustNewPublisher(ctx, valkeyCfg, cfg) // panicol hiba esetén; a szokásos main()-konstruktor

err := pub.Publish(ctx, channel, msg)
err = pub.Close()

A Publisher egy publish-only centrifuge.Node, ami osztozik a projekt Valkey brokerén; sosem fogad kapcsolatot, így egy csak publikáló process (egy worker, egy egyszeri script) semmi mástól nem függ, csak egy Valkey felé menő hálózati klienstől. A Publish fire-and-forget: egy sikertelen publish visszaadódik a hívónak, nincs újrapróbálva és nincs queue-zva, ezért a durability-történet a database csatorna, nem ez.

notify.NewBroadcastChannel(pub, cfg.ChannelPrefix)

egy Publisher-t csomagol egy notify.Channel-lé, amihez a Hub a Broadcastable tartalmat dispatcholja.

Csatorna-elnevezés: UserChannel és TopicChannel

func UserChannel(prefix, subject string) string  // egy recipiens saját csatornája
func TopicChannel(prefix, topic string) string    // megosztott, opt-in topic-csatorna

Minden kapcsolatot, amit a realtime gateway elfogad, server-side feliratkoztat a saját UserChannel-jára, ami azt jelenti, hogy egy Recipient.ID-nak címzett notification kliens-oldali subscribe hívás nélkül eljut pontosan annak a usernek az élő kapcsolatáig. A TopicChannel a megosztott csatornákat nevezi meg, amiket a broadcast az egy-recipienses notificationökön túl használ (announcementek, admin-riasztások); az ehhez szükséges TopicAuth/Allow/AllowPrefix authorizációért lásd a Realtime: megosztott topic-csatornák szakaszt, ami az auth/rbac Identity-jére támaszkodik.

NewNode

func NewNode(cfg ValkeyConfig, centrifugeCfg centrifuge.Config) (*centrifuge.Node, error)

A NewNode a két szerep közös konstruktora: egy publish-only node (amit a NewPublisher csomagol) és a teljes, kapcsolatokat fogadó node, amit a realtime gateway futtat. Bedrótozza a Valkey brokert, amire a centrifuge-nak szüksége van ahhoz, hogy egy publish minden gateway-példányhoz eljusson, függetlenül attól, melyik process publikálta.

Memory

mem := broadcast.NewMemory()
pub := mem.All() // []broadcast.Published, minden eddig rögzített

A Memory egy test double: minden publikálást rögzít Valkey érintése helyett, így egy notification ToBroadcast-ja (vagy egy notify.NewBroadcastChannel(mem, prefix)-szel bekötött csatorna) közvetlenül assertálható, ugyanúgy, ahogy a mail.NewMemory() és a notifydatabase.NewMemoryStore() is a valódi driverét helyettesíti.

A kittel

A gateway, ami egy Publish hívást élő kliens-push-sá alakít, a skálázási modellje és a kliens-oldali feliratkozási történet mind a Realtime oldalon van. A megosztott topic-csatornák authorizációs modellje az auth/rbac Identity-jére épül. A broadcast-csatorna egy notification Via-jába drótozását az add notification tárgyalja.

Kapcsolódó oldalak

  • Áttekintés: a Hub, a Notification és a mail-csatorna.
  • Database: a durable csatorna, amit ez kiegészít, sosem helyettesít.
  • Realtime: a gateway, a skálázási modellje és a kliens.
Copyright © 2026