/ / sledovanie online užívateľov v Golang - session, go, server

sledovanie používateľov online v Golang - relácia, ísť, server

Pred dávnou dobou som si vytvoril webovú stránku so spoločnosťou Golang, teraz chcem sledovať používateľov online.

Chcem to urobiť bez Redis a pracovať s SessionID.

Aký je najlepší spôsob mojej práce?

Napísal som globálny obsluhujúci pracovník:

type Tracker struct {
http.Handler
}

func NewManager(handler http.Handler) *Tracker {
return &Tracker{Handler: handler}
}

func (h *Tracker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println(r.RemoteAddr)
h.Handler.ServeHTTP(w,r)
}

. . .

    srv := &http.Server{
Handler:      newTracker(e),
Addr:         "127.0.0.1" + port,
WriteTimeout: 15 * time.Second,
ReadTimeout:  15 * time.Second,
}

log.Fatal(srv.ListenAndServe())

Myslím si, že jedna z vecí, ktoré môžem urobiť, je:

Pridajte ID klienta v klientovi a uložte ho na mapu na serveri. Počítajte online používateľov a sledujte ich.

Je to dobrá a správna cesta?

odpovede:

3 pre odpoveď č. 1

Globálny obslužný program, middleware (ak používate arouter pkg pozrite sa na to) alebo by stačilo iba volanie funkcie štatistiky na populárnych stránkach. Dajte pozor, aby ste vylúčili roboty, rss zásahy alebo iný prenos, o ktorý sa nestaráte.

Za predpokladu, že máte jeden proces a chcete ho sledovaťpoužívatelia online za posledných 5 minút alebo tak niečo, áno, strana mapového servera by bola v poriadku, môžete vydávať tokeny (záleží na tom, či používateľ povolí súbory cookie, na každú požiadavku použije šírku pásma), alebo len hash ip (funguje celkom dobre, potenciál na mierne podhodnotenie) ). Potom ich musíte po určitom intervale vypršať a na ich ochranu použite mutex. Pri reštarte stratíte počet, ak spustíte dva procesy, nemôžete to urobiť, je to nevýhoda ukladania v pamäti, budete potrebovať ďalší proces ukladania do vyrovnávacej pamäte, takže nie je vhodný pre veľké weby, ale môžete ľahko prejsť na pomocou trvalejšieho obchodu neskôr.

var PurgeInterval = 5 * time.Minute
var identifiers = make(map[string]time.Time)
var mu sync.RWMutex

...

// Hash ip + ua for anonymity in our store
hasher := sha256.New()
hasher.Write([]byte(ip))
hasher.Write([]byte(ua))
id := base64.URLEncoding.EncodeToString(hasher.Sum(nil))

// Insert the entry with current time
mu.Lock()
identifiers[id] = time.Now()
mu.Unlock()

...

// Clear the cache at intervals
mu.Lock()
for k, v := range identifiers {
purgeTime := time.Now().Add(-PurgeInterval)
if v.Before(purgeTime) {
delete(identifiers, k)
}
}
mu.Unlock()

Niečo také.