나의 개발 일상 기록
FCM서버 비동기(Asynchronous)로 요청 및 응답 본문
Firebase Cloud Message
1. FCM(Firebase Cloud Message)이란
FCM은 Firebase Cloud Message으로, 앱 서버에서 구글에서 제공하는 FCM을 이용하여 사용자 디바이스가 설치된 앱 단위로 메시지를 전송할 수 있는 서비스로, Firebase콘솔이나 서버에서 푸시를 보낼 수 있습니다.
2. FCM 아키텍쳐

- 메세지 요청을 작성하거나 구현하는 도구의 역할을 합니다.
- FCM 백엔드는 다른 기능 중에서 메시지 요청을 수락하고, 주제를 통해 메시지를 확장하고, 메시지 ID와 같은 메타데이터를 생성합니다..
- 기기로 타겟팅된 메시지를 라우팅하고, 메시지 전송을 처리하고, 필요한 경우 플랫폼별 구성을 적용하는 플랫폼 수준의 전송 레이어입니다.
- 알림이 표시되거나 앱의 포그라운드/백그라운드 상태 및 관련 애플리케이션 로직에 따라 메시지가 처리되는 사용자 기기의 FCM SDK입니다.
3. 동기(Synchronous) vs 비동기(Asynchronous)
Synchronous
동기 방식에선 클라이언트가 서버에 요청을 보내면 응답을 받기 전가지 블로킹(Blocking)됩니다. 블로킹된다는 것은 현재 스레드가 다른 일을 하지 못하고 기다린다는 것을 의미합니다. 따라서 두 개의 요청을 A와 B서버로 보내면, A의 응답이 끝나고 나서야 B로 요청을 보낼 수 있습니다. 그렇다면 FCM서버를 동기 방식으로 운영을 한다면 요청과 응답이 많아질수록 성능은 기하급수적으로 떨어지게 될 것입니다.

Asynchronous
비동기 방식에서는 현재 스레드가 블로킹되지 않기 때문에 다른 일을 계속할 수 있습니다. A에게 요청을 보낸 뒤 다른 일을 처리할 수도 있고, 혹은 B에게 또 다른 요청을 보낼 수도 있습니다. 많은 양을 요청과 응답이 존재할 경우 비동기 방식을 적용한다면 성능과 속도 또한 개선될 것으로 보여집니다.

4. FCM 비동기 처리
- FirebaseMessaging 클래스의 sendAsync 메서드 사용
/**
* Similar to {@link #send(Message)} but performs the operation asynchronously.
*
* @param message A non-null {@link Message} to be sent.
* @return An {@code ApiFuture} that will complete with a message ID string when the message
* has been sent.
*/
public ApiFuture<String> sendAsync(@NonNull Message message) {
return sendAsync(message, false);
}
- @Async 어노테이션을 사용하여 메서드를 비동기 방식으로 변경
@Configuration
public class AsyncConfig {
/**
* 어노테이선 `@Async`를 사용할 때 설정을 진행한다.
* 해당 설정으로 '@Async`를 사용하기 위해서는 value값에 해당 빈의 이름을 사용해야한다.
* @return
*/
@Bean("asyncTask")
public Executor threadPoolExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("asyncTask-"); // thread 이름 설정
executor.setCorePoolSize(5);
executor.setMaxPoolSize(100); // 최대 스레드 개수
executor.setQueueCapacity(0);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
return executor;
}
}
@Async("asyncTask")
public void sendMessageToUser(PushMessage messageInfo, String userId) {
'ETC' 카테고리의 다른 글
| SockJs을 이용한 1:1 채팅 구현하기 (0) | 2021.07.07 |
|---|---|
| 대용량 트래픽 환경에서 서버 부하를 줄이기 위한 캐싱 적용 (0) | 2021.07.05 |
| REST API (0) | 2021.07.05 |
| AOP 적용하여 부가적인 로직 제거 (0) | 2021.06.29 |
| 서버확장을 위한 SCALE UP vs SCALE OUT (0) | 2021.06.28 |
Comments