이전 포스팅에서는 웹서비스의 구성 변화에 대해서 알아보고 웹서비스를 구성하는 요소중 CDN, Load Balancer, Web Application Service, Database, File Storage에 대해서 알아보았습니다.
이번 포스팅에서는 저번에 다루지 않은 Cache Service, Message Queue, Log Service 및 기타 다른 서비스에대해서 알아보도록 하겠습니다.
Cache Service는 웹 서비스내 서비스들이 이용할 수 있는 Cache를 제공해주는 서비스입니다. Cache Service는 컴퓨터 내의 Cache처럼 영구적인 데이터를 저장하는 저장소(Database
, File Storage
)의 Cache Layer 역할을 하고, 여러 서버로 나눠진 WAS
의 공용 상태(State)저장 역할을 합니다. 주로 Cache Service는 Key-Value의 저장 형태를 가집니다.
영구적인 저장소의 Cache역할을 하는 경우 WAS
에서는 데이터를 가져올떄 먼저 Cache Servic에 저장된 데이터가 있는지 확인하고 없으면 Database에서 데이털르 가져옵니다. 이때 가져온 데이터를 Cache Service에 저장합니다.
이러한 작업은 Cache Service는 I/O작업이 빠르고 또한 Database에 부하가 집중되는 것을 막을 수 있어 서비스 성능 향상에 도움이 됩니다.
공용 상태저장소로 이용하는 대표적인 CASE는 Session 저장이 있습니다. Session의 경우 클라이언트의 인증 정보나 클라이언트의 상태를 저장하기 위해서 주로 사용하는데 기본적으로는 WAS의 메모리에 저장합니다. 그러나 많은 사용자의 요청을 처리하기 위해서 WAS를 다중화 하였을 경우 메모리에 저장하여 클라이언트의 상태를 저장하는게 불가능합니다. Cache Service에 Seession 상태를 저장하여 사용자가 어떤 WAS에 접속하던 동일한 서비스를 받을 수 있게 할 수 있습니다.
또한 Cache Service는 글로벌 상태 저장 및, 메세지 교환에도 이용할 수 있습니다.
대표적인 Cache Service로는 Redis
와 MemCache
가 있습니다.
Message Queue는 분산 시스템에서 비동기로 메세지를 송수신해주는 서비스입니다. 서로 다른 WAS끼리의 통신이나 그 외 여기서 소개 시켜드린 다양한 시스템 간에 메세지 교환을 위해서 사용합니다. 또한
위의 그림은 RabbitMQ라는 Message Queue의 동작 방식을 그린 그림입니다. RabbitMQ는 Queue 형태의 데이터를 여러개 가지고 있습니다. WAS와 같은 분산 컴포넌트가 다른 컴포넌트에게 메세지를 보내게 하기위해 MQ에 보내면 MQ는 메세지의 주제에 따른 Queue에 집어넣습니다. 수신 컴포넌트는 자신이 관심있는 주제의 Queue에 메세지가 있는지 확인하고 메세지가 있으면 읽고 처리하는 방식으로 데이터를 받게 됩니다.
이러한 방식은 메세지가 비동기로 현재 유효한 컴포넌트에게 전달되기 때문에 속도가 굉장히 빠르고, 처리량이 많은 장점이 있습니다.
대표적인 Message Queue Application으로는 Kafka
, RabbitMQ
, activeMQ
, zeroMQ
등이 존재합니다.
Log Service와 Log Storage는 전체 시스템들의 Log를 저장하고 관리하는 역할을 합니다. 개발 로그 뿐 아니라, 시스템 로그까지 볼 수 있게 제공해 줍니다.
그리고 일반 데이터도 시계열 데이터베이스에 저장하면 더욱 빠르게 검색할 수 있어 TextSearch에도 이용이 됩니다.
위의 그림은 fluentD와 ElasticSearch를 통해 로그를 수집하는 구조를 나타낸 것입니다. FluentD는 로그를 수집하고 Log Storage에 로그를 모아주는 Log Agent 서비스입니다. 로그를 수집할 Node에 Agent를 설치하면 Agent는 로그 파일이 업데이트 되면 주기적으로 업데이트한 내용을 Log Service에 전달을 해줍니다. LogService는 Log Storage에 데이터를 저장합니다.
Log Storage는 5에서 설명한 S3와 같은 FileStorage를 사용하기도 하고 로그가 많고 검색이 잦을경우 Elasticsearch, influxDB와 같이 검색에 최적화된 시계열 데이터베이스를 사용하기도 합니다. 많은 경우 시계열 데이터베이스를 메인으로, 백업용으로 File Storage를 사용합니다.
마지막으로 Grafana와 Kibana와 같은 도구는 로그를 검색하고 찾는 UI/UX를 제공해줍니다.
주로 로그 서비스의 구성은 ElasticSearch(저장소) + logstash 혹은 fluentD (로그 수집) + Kibana(UI/UX)
를 조합해 사용하거나, grafana쪽 Loki(저장소) + Promtail(어플리케이션 로그 수집)&Prometheus(시스템 로그 수집) + Grafana(UI/UX)
를 조합해서 사용합니다.
최근에는 단독으로 모든 서비스를 제공하기 보다는 많은 다른 서비스와 연동해서 시스템을 운영합니다. 실제로 이렇게 되면 직접 모든 것을 만들지 않아도 되고, 사용자에게 더 좋은 편의성을 제공할 수 있죠.
가장 많인 사용하는 외부 서비스로는 OAuth 서비스가 있습니다. Google인증, Kakao인증 등이 여기 해당되죠. 사용자는 Google ID를 통하여 우리 서비스를 접근 할 수 있기 때문에 편의성이 많이 증대되죠.
결제 같은경우도 PG나 카카오페이, 네이버페이등을 이용하여 진행합니다.
채팅 서비스를 제공해주는 SendBird나 ChannelTalk을 이용하여 쉽게 고객응대를 시스템을 구축할 수 있습니다.
우리 사이트의 마케팅 분석을 위해서는 Google Analytics와 같은 서비스를 이용해서 어떤 곳에서 온 사용자가 우리서비스를 얼마나 이용하는지 분석하고 있지요.
이런 외부 서비스를 이용하면 적은 개발로 많은 서비스를 제공할 수 있다는 장점이 있습니다.
이번 포스팅을 통해서 현대 웹 서비스를 구성하는 다양한 서비스와 구조에 대해서 알아보았습니다. 최대한 많이 담으려고 노력을 하였으나 현재 웹서비스를 구성하는 컴포넌트를 다는 소개하지 못했던점 양해 부탁드립니다.
우리가 서비스를 구축하기 위해서 위에서 언급한 모든 서비스를 이용할 필요는 당연히 없을 것입니다. 각자의 이름과 용도를 유추해 자신이 필요한 시점에 각각의 서비스를 붙여서 더 좋은 서비스를 만드는데 도움이 되시길 바랍니다.
카우치코딩에서는 1:1 코딩 문제해결 멘토링 서비스입니다. 가르치는데 관심있는 멘토분들이나 문제해결이 필요한 멘티분들 방문해주세요~
또한 별도로 6주 포트폴리오 수업을 진행중에있습니다. 혼자 포트폴리오 준비를 하는데 어려움이 있으면 관심가져주세요~