Middle — Senior
Hogyan valósítható meg az automatik híváselutasítás logikája, ha egy felhasználótól több mint 10 hívás érkezik 15 perc alatt?
sobes.tech MI
Válasz az MI-től
Egy felhasználótól több mint 10 hívás 15 percen belül történő automatikus elutasításának logikáját úgy lehet megvalósítani, hogy egy mozgó időablakot és egy hívásszámlálót használunk. A fő ötlet az, hogy tároljuk a felhasználó hívásainak időbélyegeit, és egy új hívásnál ellenőrizzük, hány hívás történt az elmúlt 15 percben.
Példa Go nyelven:
package main
import (
"fmt"
"sync"
"time"
)
type CallTracker struct {
mu sync.Mutex
callsMap map[string][]time.Time // kulcs — felhasználói azonosító, érték — hívás időbélyegeinek szelete
}
func NewCallTracker() *CallTracker {
return &CallTracker{
callsMap: make(map[string][]time.Time),
}
}
func (ct *CallTracker) RegisterCall(userID string) bool {
ct.mu.Lock()
defer ct.mu.Unlock()
now := time.Now()
windowStart := now.Add(-15 * time.Minute)
calls := ct.callsMap[userID]
// Csak az elmúlt 15 perc hívásait tartsa meg
var recentCalls []time.Time
for _, t := range calls {
if t.After(windowStart) {
recentCalls = append(recentCalls, t)
}
}
if len(recentCalls) >= 10 {
// Automatikus elutasítás
return false
}
// Hozzáadjuk az aktuális hívást
recentCalls = append(recentCalls, now)
ct.callsMap[userID] = recentCalls
return true
}
func main() {
tracker := NewCallTracker()
userID := "user123"
for i := 0; i < 12; i++ {
allowed := tracker.RegisterCall(userID)
if allowed {
fmt.Println("Hívás elfogadva")
} else {
fmt.Println("Hívás elutasítva")
}
time.Sleep(1 * time.Minute)
}
}