그래서 이벤트 대기열과 무한 루프의 해당 대기열에서 이벤트를 가져 오는 일부 goroutines을 처리하여 채널로 결과를 보냅니다. 다른 대기열이 동일한 이벤트를 제공 할 수 있으므로 각 이벤트가 정확히 한 번 채널에 전송되도록해야하며 다른 대기열에있는 해당 메시지의 발생이 무시됩니다. 나는 그것이 건축상의 문제라고 생각한다. 그러나 나는 이것을 올바르게 다루는 방법을 알 수 없다.Goroutines 및 메시지 중복 제거
내 현재 코드의 단순화 된 버전은 아래에 있습니다. 얻을 들어오는 이벤트를 처리
Goroutines은 다음과 같이 다소 찾습니다
이func (q *Queue) ProcessEvents(handler Handler) {
lastEvent = 0
for {
events = getEvents(lastEvent)
for _, e := range events {
if e.ID > lastEvent {
lastEvent = event.ID
}
handler.Handle(e)
}
}
}
처리기 :
type Handler struct {
c chan Event
}
func (h *Handler) Handle(event *Event) {
//event processing omitted
h.c <- event //Now it just sends a processed event into the channel no matter what.
}
그리고 주에서
() 나는func main() {
msgc := make(chan Event)
for _, q := range queues {
go func(queue Queue) {
queue.ProcessEvents(&Handler{msgc})
}
}
}
채널의 수신 측에서이를 수행하고 동일한 이벤트를 두 번 이상 처리하지 않으려는 것처럼 보입니다. –
그러나 atm 루틴이 서로에 대해 알지 못한다면 이벤트가 이미 다른 goroutine에 의해 처리되었는지 어떻게 확인합니까? 그것은 정말로 중요한 질문입니다. –
단일 스레드 인 경우 어떻게합니까? 이것은 goroutines에 관한 것이 아닙니다. 중복 제거를 원할 경우 메시지가 복제본인지 여부를 알아야합니다. 즉, 당신이 얻은 모든 메시지를 (잠재적으로) 저장하고 모든 새로운 메시지를 모든 이전 메시지와 비교하여 이전에 본 적이 있는지 확인하십시오. – Adrian