안녕하세요. 먼저 정말 좋은 강의 감사드립니다.
우선 제가 서비스하는 어플리케이션이 사용자가 한 번에 대용량 이미지를 올려야 하는 서비스입니다. 이와 관련해서 몇 가지 고견을 듣고자 글을 남깁니다.
우선 첫번째로,
1. 서버가 대용량 이미지를 받아서 전처리 과정을 해줘야 하는데
서버의 부하를 막기 위해서 운영서버/이미지 처리 서버를 분리하는것이 더 좋은 방법인지 조언을 듣고 싶습니다. 만약 운영서버 이미지 처리 서버를 분리하게 되면 저도 아직 해보진 않았지만 마이크로서비스 아키텍쳐라고 불리우는 작업들을 해줘야 할 것 같은데 꽤 복잡한 작업이 될 것 같아 걱정이 되긴 합니다.
2. 사용자가 올리는 이미지나 파일에 대해서 저장 방식을 다르게 가져가려고 하는데 예를 들어서 일반적인 이미지나 썸네일 같은 경우는 s3 에 저장을 하도록 하고 API 호출을 받아서 빠르게 읽어온 다음에 처리를 해줘야 하는 파일 같은 경우는 별도의 HDD 를 붙혀서 저장하려고 합니다. 괜찮은 방법인지 혹시 조언을 구하고자 질문을 드립니다. 그리고 대용량 이미지를 계속해서 저장해 나가야 하는 경우 s3 가 HDD 보다 더 효율적일까요?
제가 서버 아키텍쳐의 경험이 없어서 이미지 관련하여 처리를 어떤식으로 해줘야 할지 고민을 하다가 혹시 도움이 될 수 있을 것 같아서 질문드립니다. 감사합니다.
로날루영님 안녕하세요 :)
좋은 질문들이네요.
1. 생각하신대로 서버를 분리하는게 좋아요. 이미지 전처리는 물론 업로드도 서버에 상당한 부하를 주게 됩니다. 트래픽이 조금이라도 몰리게 되면 금방 부하가 걸려요. 이미지 업로드/전처리 하는 과정에서 최소한 이미지 용량만큼 메모리를 차지한다고 보시면 되요.
하지만 이 경우 MSA는 적합하지 않아요. MSA는 복잡한 로직을 분산해서 처리하는 용도라고 보시면 되요. 부하분산의 장점도 있지만 로직 분산 장점이 매우 큽니다. 이미지 업로드와 전처리 이런 작업들은 로직상으로 복잡한 작업들이 아니에요. 하지만 이미지 작업 특성상 서버에 부하가 많이 갈 뿐입니다.
이미지 처리 경우 다행히 좋은 해결책이 있습니다. 강의 뒷부분에서 다루게 될 내용들인데요. 부하가 걸리는 구간을 이미지 업로드와 이미지 가공(리사이징, 색변환 등등)으로 나눌 수 있는데요.
이미지 업로드는 presignedUrl을 이용하시면 됩니다. 그러면 Client에서 Server를 거치지 않고 Client에서 즉시 S3로 안전하게 전송해줍니다. 불필요한 중간단계가 사라지는거죠. 그렇다고 Client에서 특별히 더 추가되는 부하는 없고요. (presignedUrl을 서버에 요청하는 작업이 추가되긴 하지만 이건 일반적인 API요청과 동일하기 때문에 이미지 업로드에 비하면 상대적으로 부하가 없다라고 보면 되요.)
그리고 이미지 가공을 하기 위해서는 서버가 필요한데요. 이건 별도 서버를 직접 관리하시는 것보다는 AWS Lambda와 같은 서벌리스 서버를 사용하시는걸 권장합니다. 람다는 일반적인 서버와 다르게 요청 부하에 따라 작은 서버 인스턴스들을 부하에 비례해서 즉시 생성한다고 보시면 되요. 부하가 줄어들면 서버들이 사라지고요. 비용은 정확히 요청을 처리하는 동안만 발생합니다. 인스턴스가 살아 있어도 요청을 받지 않는 상황이면 과금이 되지 않아요.(요청이 없어도 15분 정도인가 살아 있어요) Kubernetes 같은걸 이용해서 부하에 따라 서버를 증설하는 것과 무엇이 다른가라고 생각할 수 있는데요. 서버 증설 단위가 달라요. Kubernetes로 하게 되면 일단 관리가 좀 더 복잡해지기도 하고 부하에 따라 서버를 증설하게 한다고 해도 증설하는데 반응하는 시간이라든지 증설 단위가 더 크기 때문에 비용이 달라요. Kubernetes는 나중에 서비스 자체가 고도화 되서 MSA를 적용해야한다는 판단이 서면 그 때 도입하시면 됩니다.
2. 이미지와 같은 정적 데이터들은 S3 같은 곳에 저장하는것이 훨씬 좋습니다. 강의 후반에 S3에 Cloudfront라는 CDN을 연동해서 사용하게 되는데요. CDN에서 불러오는게 가장 효율이 좋습니다. 사용자와 가까운 데이터센터에 캐싱을 해주기 때문에 글로벌 서브스는 특히 더 좋습니다. 이미지를 직접 서버로 관리하시면 부하 문제도 고민을 해야하는데 S3를 사용하면 이런 고민이 없어집니다. 이 내용도 강의에서 다룹니다 :)
답글
데릭로
2021.08.17혹시 django 에서 generate_presigned_post 로 사용된 url 도 똑같이 사용이 가능한가요? response 로 받은 presigned 형식이 다르고 django 에서 생성해서 그러지 javascript 에서 올라가지를 않네요
오 정말 좋은 고견 감사드립니다. 서버를 어떻게 구성할지 고민이 정말 많았는데 의견을 들어보니 S3 와 람다 조합으로 구성해야 할 것 같습니다. 정말 많은 도움이 된 것 같습니다. 앞으로 더욱 더 좋은 강의들 부탁드립니다.
답글