인프런 커뮤니티 질문&답변

최영찬님의 프로필 이미지
최영찬

작성한 질문수

미국 빅테크 29개의 실습으로 배우는 시스템 디자인 설계

Message Queue 음식 주문 예시, 구글 검색 예시

메세지 큐 예제 2번 질문있습니다!!

해결된 질문

작성

·

122

·

수정됨

0

안녕하세요! 강의를 듣다 메시지 큐 예제 2번 그림에서 질문이 생겨 글을 남깁니다!

piano cat 검색 요청을 google server(생산자)가 메세지 큐를 이용해서 results store(소비자)로 넘기고 results store(소비자)에서 처리된 요청 결과를 다시 google server(생산자)로 어떻게 넘겨 유저 요청의 응답 결과로 반환할 수 있는지 궁금합니다..

그림에서 results store -> google server 이 부분 화살표가 어떻게 그어질 수 있는지 궁금합니다!!

답변 2

0

최영찬님의 프로필 이미지
최영찬
질문자

답변 감사합니다!!! 이해가 안 되는 부분이 조금 있어 추가적으로 질문드립니다.. (메시지 큐의 장단점을 설명하는 간단한 예시에 어긋나는 질문인 것 같지만 의문이 들어 질문드립니다..)

  1. User의 piano cat 검색 요청은 google server가 message queue에 데이터를 넣고 바로 종료될 거라 생각되는데 이러면 User는 요청에 대한 응답으로 빈 값을 받지 않나요..?

  2. 만일 Google Server에서 큐에 데이터를 넣고 User 요청을 await 해 Results Store에서 Google Server로 API 엔드 포인트 전달이나 응답 메시지 큐를 활용한 응답 결과가 올 때까지 기다린 후 해당 결과를 piano cat 검색 요청을 한 User에게 전달할 수 있을까요?? (User의 검색 요청을 물고 있는 스레드와 엔드 포인트나 응답 메시지 큐를 사용하는 스레드는 달라 처리가 가능한지..)

  3. 결국, Google Server는 Results Store에서 받은 결과를 DB 저장이나 캐싱하고, User는 처음 piano cat 검색 요청에 대한 응답으로 빈 값을 받으면 Google Server에 반복적으로 데이터를 재요청 -> Google Server는 piano cat으로 저장된 데이터가 있으면 해당 값을 바로 반환하는 식으로 처리가 되는지.. 궁금합니다.

미국달팽이님의 프로필 이미지
미국달팽이
지식공유자

 

좋은 질문입니다. 

 

1. 네, 만약 Google 서버가 사용자의 piano cat 검색 요청을 받아 메시지 큐에 넣고 바로 응답을 종료한다면, 사용자는 즉시 결과를 받지 못하고 빈 응답이 메시지를 받을 수 있어서, 사용자에게 빈 응답이 반환되지 않도록 하는 방법은 동기식 처리와 비동기식 처리, Long Polling 등 몇 가지가 있습니다. 

 

Long Polling 방식은 클라이언트가 서버에 요청을 보내면, 서버는 결과가 준비될 때까지 응답을 지연시킨 후 결과를 반환하는 방식입니다. 이를 통해 사용자에게 빈 응답이 아닌 실제 결과를 제공할 수 있지만, 서버의 연결이 오래 유지되므로 자원 사용에 주의해야 합니다.

 

동기식 처리는 Google Server 가 메시지 큐에 넣은 후, Results Store에서 결과를 반환할 때까지 대기 합니다. Results Store 는 처리된 검색 결과를 Google Server 가 수신하면 사용자에게 즉시 응답으로 반환하도록 하는 것입니다. 이렇게 하면 사용자에게 일관된 응답시간을 제공하고 추가요청 없이 결과를 받을 수 있지만, 결과를 기다리는 동안 Google Server 의 리소스가 점유되며, 처리 시간이 길어질 경우 타임아웃이나 사용자 경험 저하가 발생할 수 있습니다. 

 

비동기식 처리는 Google Server 가 요청을 메시지 큐에 넣은 후, 처리가 완료되면 SSE, WebSocket 를 통해 사용자에게 결과를 반환하도록 해서 사용자에게 결과를 전달합니다. 

이 방식은 서버 리소스를 효율적으로 사용하고 대량의 요청을 처리할 수 있지만 구현 복잡성이 증가하며, 클라이언트 측에서도 결과 조회와 같은 처리가 가능해야 합니다. 

 

2. 네 가능합니다. async/await를 활용한 비동기 프로그래밍으로 구현할 수 있습니다. Google 서버가 메시지 큐에 요청을 넣은 후 결과를 받을 때까지 await를 사용하여 비동기적으로 대기하고, 결과를 받으면 사용자에게 반환하는 방식입니다.

사용자 요청을 처리하는 스레드와 Results Store 에서 결과를 받아오는 스레드는 다를 수 있고, 동일할 필요는 없습니다. 비동기 프로그래밍이나 이벤트 기반 아키텍처를 활용해서 Google Server 는 결과를 기다리지 않고도 다른 작업을 수행할 수 있습니다. 예를 들면, 콜백 함수, 말씀하신 async/await 구문 등을 사용해서 결과가 준비되면 자동으로 사용자에게 전달 되도록 구현 할 수 있습니다. 

 

3.네, Results Store 에서 받은 결과를 데이터베이스나 캐시에 저장하여, 동일한 요청에 대해 빠르게 응답할 수 있습니다. 초기 요청시에는 사용자에게 처리중임을 알리는 로딩을 보여주고 결과가 준비되면 업데이트된 데이터를 제공할 수 있습니다. 그러나 사용자가 결과를 받기 위해 반복적으로 요청해야 한다면, 사용자 경험이 저하될 수 있음을 주의하고 클라이언트 측에서 일정 시간 간격으로 결과를 확인하여 자동으로 업데이트 되도록 하는 자동 새로고침 등과 같은 개선방안을 찾아야 합니다. 

 

결론적으로 사용자 경험과 시스템 성능의 균형을 맞추는 것이 중요하고 실시간성이 중요한 서비스라면, 동기식 처리를 통해 사용자에게 즉각적인 결과를 제공하는 것이 좋습니다. 하지만 대규모 트래픽이나 긴 처리 시간이 예상된다면, 비동기식 처리를 사용해서 시스템 부하를 줄이면서 사용자에게 필요한 데이터를 제공하도록 하는 것이 적합하다고 할 수 있습니다. 

0

미국달팽이님의 프로필 이미지
미국달팽이
지식공유자

먼저, 메시지 큐는 요청을 저장하고 순서대로 전달하는 역할을 하지만, 일반적으로 큐가 직접 소비자에게 메시지를 전달하는 것이 아니라, 소비자가 큐에서 메시지를 가져와서 처리하는 방식입니다.

"Piano cat" 검색 요청을 Google 서버에서 받아서, 이 요청을 메시지 큐에 넣어 대기열에 추가합니다. 그 후, 메시지 큐로부터 Results Store가 해당 요청을 가져옵니다. Results Store에서는 데이터베이스 조회, 인덱싱 등의 알고리즘을 사용하여 실제 검색 작업을 수행합니다.

이렇게 처리된 결과를 Results Store에서 Google 서버로 반환하는데, 별도의 응답 메시지 큐를 추가해서 구성을 해서 Google 서버가 그 큐에서 결과를 가져오도록 할 수 있습니다. 하지만 응답 메시지큐를 별도로 추가하게 되면 비동기 처리에 효율적이지만, 시스템 복잡성이 증가할 수 있습니다.

그리고 메시지 큐 없이 직접 Google 서버로 결과를 반환한다면, Results Store에서 Google 서버의 RESTful API 엔드포인트로 전달 하거나 RPC 등을 통해 결과를 Google 서버에 전달할 수 있습니다. RESTful API 엔드포인트로 전달 예시를 코드로 직접 보여드리기 위해 첨부합니다.

api_endpoint = 'http://localhost:5000/api/search_results'

response = requests.post(api_endpoint, json={'query': search_query,

'results': search_results})

if response.status_code == 200: print(f"결과를 성공적으로 전달했습니다: {search_results}")

else: print("결과 전달에 실패했습니다.")

이러한 과정을 통해 Google 서버는 사용자에게 응답을 반환하게 됩니다. 이러한 시스템 구성을 통해 모듈화, 확장성이 향상되며, 각 시스템 컴포넌트가 독립적으로 작업을 수행할 수 있습니다. 또한 로드 밸런싱 및 장애 처리에도 유리한 구조가 될 수 있습니다.

강의 열심히 들어주셔서 감사합니다. 언제든지 질문 올려주세요! 다만, 미국 캘리포니아 서부에 살고 있어서 답이 느릴 수 있습니다.

최영찬님의 프로필 이미지
최영찬

작성한 질문수

질문하기