간단한 아키텍처와 함께 알아보자!
한개의 스레드를 실행시켜 if문을 사용하여 조건별로 처리해도 되지만,
가독성을 위하여 push 알림 타입별로 스레드를 실행하였다.
consumer := queue.NewConsumer(queueAlarmService, consumerConfig)
consumer.AddWork(dto.Type1, consumerApplication.ConsumeProfile)
consumer.AddWork(dto.Type2, consumerApplication.ConsumeContentMedia)
consumer.AddWork(dto.Type3, consumerApplication.ConsumeContentDrawing)
consumer main 스레드가 실행되고 AddWork
로 추가 스레드를 실행
func (c *Consumer) worker(ctx context.Context, wg *sync.WaitGroup, id int, workerInfo WorkerConfig) {
defer wg.Done()
for {
select {
case <-ctx.Done():
c.logger.Printf("worker %d: stopped\n", id)
return
default:
}
messages, err := c.queueAlarmService.Receive(ctx, int64(workerInfo.MaxMsg), workerInfo.WaitTimeSec)
c.setUpLogger(ctx)
if err != nil {
continue
}
if len(messages) == 0 {
continue
}
c.sync(ctx, messages)
}
}