Broadcast 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, aNotificationé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.