[Golang] SQS, OneSignal 를 이용한 app push 알림 구현

suji·2023년 8월 2일
0

Go

목록 보기
1/9
post-thumbnail

App push 알림은 어떻게 오는걸까?

간단한 아키텍처와 함께 알아보자!

  1. 서비스에서 이벤트 발생 시, SQS로 queue를 생성한다.
  2. SQS에 큐가 쌓인다.
  3. 알림 서비스에서 수시로 SQS에 queue가 있는지 확인한다.
    • 무한루프를 실행시킨다.
  4. 알림 서비스에서는 queue를 풀링하여 알림 DB 에 데이터를 저장한다.
    • 저장하는 이유
      • queue는 서버로 전송되면서 사라진다.
      • 알림 조회 기능을 위해서 DB에 저장한다.
  5. 알림 서비스에서 message를 생성, 해당 알림을 받아야 하는 user의 player_id 를 조회하여 oneSignal 을 통해 push 알림을 전송한다.
    • player_id: 기기를 구분하는 고유한 식별자

알림 서비스 구현

한개의 스레드를 실행시켜 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) 
	}
}
profile
문제를 해결하는 백엔드 개발자

0개의 댓글