/ / rastreamento de usuários on-line em Golang - sessão, viagem, servidor

rastreamento de usuários on-line em Golang - sessão, ir, servidor

Há muito tempo atrás, criei um site com a Golang, agora quero rastrear usuários online.

Quero fazer isso sem o Redis e trabalhando com o SessionID.

Qual é a melhor maneira para o meu trabalho?

Eu escrevi um manipulador global:

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())

Eu acho que um dos trabalhos que posso fazer é:

Adicione um sessionID no cliente e salve-o em um mapa no servidor. Contando usuários on-line e seguindo-os.

É o caminho certo e bom?

Respostas:

3 para resposta № 1

Um manipulador global, middleware (se você estiver usando umroteador pkg veja isso) ou apenas chamar uma função de estatísticas em páginas populares seria suficiente. Tenha cuidado para excluir bots, hits de RSS ou outro tráfego que você não se importa.

Supondo que você tenha um processo e queira acompanharusuários on-line nos últimos 5 minutos ou algo assim, sim, um servidor de mapa ficaria bem, você pode emitir tokens (depende do usuário permitir cookies, usa largura de banda em cada solicitação) ou apenas hash ip (funciona muito bem, com possibilidade de subconta ) Você precisará expirá-los após algum intervalo e usar um mutex para protegê-los. Na reinicialização, você perde a contagem; se a execução de dois processos não for possível, essa é a desvantagem do armazenamento em memória, você precisará de outro processo de armazenamento em cache para persistir. Portanto, isso não é adequado para sites grandes, mas você pode facilmente mudar para usando um armazenamento mais persistente posteriormente.

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()

Algo parecido.