2017-02-24 1 views
2

전, 골란과 웹 사이트를 만들었으니 지금 온라인 사용자를 추적하고 싶습니다.골란의 온라인 사용자를 추적

나는 Redis와 SessionID로 작업하기를 원한다.

내 작업을위한 가장 좋은 방법은 무엇입니까?

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

나는 내가 할 수있는 일의 하나의 생각은 다음과 같습니다

서버 및 온라인 사용자를 계산하고이 다음에지도에서 클라이언트에 sessionID와 추가하고 저장합니다.

좋은 방법인가요?

답변

3

글로벌 처리기, 미들웨어 (라우터 패킷을 사용하는 경우) 또는 인기있는 페이지에서 통계 기능을 호출하는 것으로 충분합니다. 봇, RSS 조회수 또는 관심없는 다른 트래픽을 제외 시키십시오.

프로세스가 하나 있고 지난 5 분 동안 온라인에서 사용자를 추적하려는 경우 네, 토큰을 발급 할 수 있습니다 (쿠키를 허용하는 사용자에 따라 다르며 각 요청마다 대역폭이 필요함) , 또는 그냥 해시 ip (꽤 잘 작동, 약간의 undercounting 가능성). 그런 다음 일정 기간 후에 종료해야하며 뮤텍스를 사용하여 보호해야합니다. 재시작 할 때 카운트를 잃어 버릴 수 있습니다. 두 개의 프로세스를 실행할 수 없다면, 이것은 메모리 저장 공간의 단점입니다. 또 다른 캐싱 프로세스가 필요합니다. 따라서 대규모 사이트에는 적합하지 않지만 나중에 더 영구 저장소를 사용하도록 쉽게 이동할 수 있습니다.

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

뭔가.

+0

완벽한 설명을 해주셔서 감사합니다. 내 웹 사이트에 로그인하지 않은 각 사용자에 대해 독점적 인 ID를 설정하려면 어떻게해야합니까? 많은 사용자가 단일 IP 주소를 사용하고 원격 포트가 너무 많을 수 있습니다. 너 나 좀 도와 줄 수있어? – ahmdrz

+1

큰 문제는 아니지만 (이 부분은 내가 언급 한 것보다 약간 적다) id에 해시 할 사용자 에이전트를 추가하거나 임의의 토큰을 생성하여 쿠키에 넣을 수는 있지만 쿠키 저장과 모든 요청에 ​​대한 읽기/쓰기가 필요하다. . 예제에 추가합니다. –

+0

그레이트 맨! 고맙습니다, 해시 된 사용자 에이전트는 특별한 해쉬입니다. – ahmdrz

관련 문제