add realtime
Ezt a generátort akkor éri meg elővenni, amikor a projektnek élő frissítéseket kell küldenie a csatlakozott kliensekhez: egy értesítés-badge, egy élő rendelésállapot, egy chatüzenet.
go tool gpsystem add realtime
Hozzáadja a cmd/realtime-ot: egy dedikált szervert, ami a kliens streaming-kapcsolatokat tartja (WebSocket, HTTP-streaming/SSE fallbackkel), és a bármely processből a notify/broadcast-on keresztül publikált üzeneteket kézbesíti. Nem hordoz üzleti függőséget, ezért szabadon, az API/worker processektől függetlenül skálázódik; lásd a Realtime oldalt az architektúráért és a skálázási történetért.
Explicit, opt-in parancs, nem new project default: mint az add worker-t, akkor futtatod, amikor a projektnek ténylegesen szüksége van a gatewayre, és egy Traefik-exponált service-et ad hozzá.
Mit generál
func main() {
cfg := envconf.MustLoad[config.Config]()
ctx := context.Background()
err := realtime.Run(ctx, cfg.Realtime, func(topics *realtime.TopicAuth) error {
// Itt authorizáld a megosztott topic-csatornákat, pl.:
// topics.Allow("announcements", func(id *rbac.Identity) bool { return true })
// gpsystem:topics
return nil
},
// gpsystem:closers
)
if err != nil {
log.Fatal(err)
}
}
Realtime realtime.Config
A realtime.Config újrahasznosítja a VALKEY_*-ot (queue.Config) és a JWT_*-ot (auth.Config); nincs új secret, amit kezelni kell. Lásd a Realtime oldalt a teljes REALTIME_* táblázatért.
compose.yml és .env.example
Hozzáad egy realtime service-t (path-alapon routolva a /realtime alatt a projekt meglévő APP_HOST-ján, tehát nincs új DNS-bejegyzés vagy CORS-eset): nincs container_name (így a --scale működik), egy Traefik health-check label a /realtime/healthz-re mutatva (így egy draining példány kiesik a load-balancer poolból), responseForwarding.flushInterval=-1 (így a streamelt bájtok azonnal flush-ölnek a proxyn át).
realtime:
build: { context: ., dockerfile: Dockerfile, target: development, args: { CMD: realtime } }
depends_on:
valkey:
condition: service_started
stop_grace_period: 30s
labels:
- traefik.http.routers.shopRealtime.rule=Host(`${APP_HOST}`) && PathPrefix(`/realtime`)
- traefik.http.services.shopRealtime.loadbalancer.healthCheck.path=/realtime/healthz
REALTIME_LISTEN_ADDR=:3000
REALTIME_DRAIN_TIMEOUT=20s
REALTIME_CHANNEL_PREFIX=<projekt>
REALTIME_MAX_CONNECTIONS=0
Skálázd minden más service-től függetlenül:
docker compose up -d --scale realtime=3
Megosztott topicok authorizálása
Minden kapcsolat automatikusan server-side feliratkozik a saját user:<subject> csatornájára; ehhez nem kell kód. A megosztott topicok opt-in: regisztrálj egy callbacket a cmd/realtime/main.go-ban a // gpsystem:topics anchornál, és egy kliens név szerint iratkozhat fel rá. Egy topic, aminek nincs regisztrált Allow-ja, sosem iratkoztatható fel; lásd a Realtime oldalt.
Egy notification bekötése
Az add realtime csak magát a gatewayt drótozza be. Futtasd az első add notification előtt, hogy a broadcast csatorna automatikusan bedrótozódjon a közös notify.Sender-be; ha már léteznek notificationök, add hozzá kézzel a notify.ChannelBroadcast-ot a Via-jukhoz és a broadcast-konstrukciót (lásd az add notification jegyzetét).
Az add realtime a gpsystem:imports/gpsystem:config anchoroknál ír a platform configban, és a gpsystem:services/gpsystem:env anchoroknál a compose.yml/.env.example-ben. Ha valamelyik anchor-komment hiányzik, a parancs megáll, és kiírja a beillesztendő blokkot, ugyanúgy, ahogy az add mail is teszi.