初始化仓库
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
const dedupTTL = 60 * time.Second
|
||||
|
||||
// StartTime is set once at process startup.
|
||||
// Platforms use it to discard messages created before the current process started,
|
||||
// preventing replayed/unacknowledged messages from being re-processed after a restart.
|
||||
var StartTime = time.Now()
|
||||
|
||||
// MessageDedup tracks recently seen message IDs to prevent duplicate processing.
|
||||
// Safe for concurrent use.
|
||||
type MessageDedup struct {
|
||||
mu sync.Mutex
|
||||
seen map[string]time.Time
|
||||
}
|
||||
|
||||
// IsDuplicate returns true if msgID was already seen within the TTL window.
|
||||
// Empty msgID is never considered a duplicate.
|
||||
func (d *MessageDedup) IsDuplicate(msgID string) bool {
|
||||
if msgID == "" {
|
||||
return false
|
||||
}
|
||||
d.mu.Lock()
|
||||
defer d.mu.Unlock()
|
||||
if d.seen == nil {
|
||||
d.seen = make(map[string]time.Time)
|
||||
}
|
||||
now := time.Now()
|
||||
for k, t := range d.seen {
|
||||
if now.Sub(t) > dedupTTL {
|
||||
delete(d.seen, k)
|
||||
}
|
||||
}
|
||||
if _, ok := d.seen[msgID]; ok {
|
||||
return true
|
||||
}
|
||||
d.seen[msgID] = now
|
||||
return false
|
||||
}
|
||||
|
||||
// IsOldMessage returns true if msgTime is before the process StartTime.
|
||||
// A small grace period (2 seconds) is applied to avoid race conditions
|
||||
// with messages sent right at startup.
|
||||
func IsOldMessage(msgTime time.Time) bool {
|
||||
return msgTime.Before(StartTime.Add(-2 * time.Second))
|
||||
}
|
||||
Reference in New Issue
Block a user