초기 설계의 중요성
마이크로 서비스를 개발하는데 있어서, 가장 중요한 점은 독립성이 최 우선이기도 하지만, API설걔에 있어서 거의 변경사항이 없다고 봐야한다고 할 정도로 완벽하게 설걔를 해야 한다는 점입니다. 마이크로 서비스는 모놀리식과는 다르게 회사의 규모가 큰 경우에 진행되고, 각각의 서비스가 하나의 팀인 경우가 많게 됩니다. 그러면 각 팀마다의 소통은 별로 없을 수도 있고, 이에 따라 API의 설계가 자꾸 바뀌면 매우 골치아파집니다.
그리고 마이크로 서비스에 있어서 스키마 관리도 매우 중요합니다. 만약에 서비스1에서 shop_name이 있고, 서비스2에도 shop_name이 있다면 이는 매우 효율적이지 못한 DB구조입니다. 따라서 각각의 서비스는 id와 최소의 정보만으로 정보들을 참조할 수 있게끔 해야 합니다.
또한 스케일링을 독립적으로 할 수 있다는 장점이 있습니다. 예를 들어서 서비스2는 머신러닝만 전문적으로 하는 서비스여서 스케일업을 오지게 많이 해주어서 GPU를 많이 할당해주면 되는식으로 말이죠. 이런식으로 독립적으로 스케일업해서 서버의 특성에 맞게 스케일링 할 수 있게 됩니다.
따라서 초기 스타트업에서 MVP를 구현하는데 있어서, 마이크로 서비스는 적절하지 않다고 다시한번 말하게 되는겁니다. 서비스의 어떤 비지니스적 컨셉이 확실히 정립된 후에 이를 도입을 하는 것이 맞습니다. 그리고 정립이 되어있다고 하더라도, 필요성을 못느낀다면 이를 안하는게 맞습니다. 왜냐하면 모놀리식 -> MSA로 바꾸는 것은 매우 크고 골치아픈 작업이기 때문입니다.
End-to-End 테스트 환경 구축
그리고 마이크로 서비스에서 무엇보다 중요한 것은 End-to-End테스트 환경의 구축입니다. 업데이트를 하기 전 배포 서버와는 다른 테스팅 서버 환경을 따로 구축하게 됩니다. 그리고 이 테스팅 환경에서 업로드 후 3일간 QA시간을 가져야 합니다. 그리고 QA목록을 위와같이 짜게 됩니다. 그럼 이제 이를 완료하게 되면, 대충 뭐가 많이 문제되는 부분인지 기획자의 눈에 들어오게 됩니다.
그럼 기획자가 이에 대한 테스팅 시나리오를 만들게 됩니다. 그리고 업데이터 전에 테스트 서버에 업로드 한 다음에 바로 테스트 시나리오를 개발자들이 수동으로 테스팅합니다. 그리고 이에 대한 자동적인 테스팅 코드를 작성하고, 이게 성공적으로 완료되면 배포되는 식으로 자동화를 해야하는 겁니다.
마이크로서비스 배포 방식
저희는 이전까지 실습할 떄 첫번쨰 방식인 호스트 하나에 여러 개를 배포하는 형식으로 마이크로 서비스를 local에 order, boss컨테이너를 두어서, 배포했습니다. 하지만 이러한 배포 방식에는 단점들이 존재합니다. 이는 서비스들 간에 독립성이 떨어지게 되고 ( 호스트 하나에 묶여 있다 보니까). 그리고 서버마다 GPU를 최적화, Memory를 최적화 할 수 있어야 하는데, 하나의 서비스를 독립적으로 자원을 최적화 할 수 없다는 단점이 있게 됩니다.
다른 방법으로는 호스트마다 서비스 하나씩 배포가 있습니다. 이는 당연히 호스트를 분리시키다 보니 독립성이 높아지게 됩니다. 그리고 가상머신 기반, 컨테이너 기반으로 나뉠 수 있는데 컨테이너 기반이 더 좋습니다.
간단히 VM, Container간의 차이를 다시 알아보겠습니다.
VM
공통적으로 하나의 서버가 있고 한 서버에는 어떤 운영 체제가 있건 HostOS가 올라갑니다. VM의 경우 HostOS에 의해 VM을 가상화 시켜주는 하이퍼바이저(virtual box, Xen, KVM, VMware)들이 있습니다. 하이퍼 바이저를 사용하여 원하는 운영체제로 GUestOS를 올려 여러 VM을 만들 수 있습니다. GuestOS도 HostOS와 같이 하나의 OS를 독립적으로 가지고 있는 것처럼 사용이 가능합니다. 여러 어플리케이션들을 설치하고 각각의 서비스를 만들 수 있게 도와줍니다.
Container
VM과 HostOS까지 설치는 동일합니다. 가장 큰 차이점은, 이 컨테이너 가상화 기술인 도커는 여러 컨테이너들간의 호스트 자원을 분리해서 사용하게 해줍니다. 이것은 리눅스 고유기술인 name space cgroup을 사용하여 격리시키게 됩니다. 한마디로 도커(컨테이너 각상화)는 OS에서 제공하는 자원격리 기술을 이용하여 컨테이너라는 단위로 서비스를 분리할수있게 만들어주고, 개발환경에 대한 걱정없이 배포가 가능하게 됩니다.
네 그래서 당연히 컨테이너로 서비스를 만들면 좋다는 것입니다!
다음시간에는 마이크로 아키텍쳐 개발 시 문제점에 대해 심도있게 다루어 보겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - AWS CodePipeline을 활용한 CI CD개요 (0) | 2022.07.12 |
---|---|
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (인프라) 마이크로 아키텍처 개발 시 문제점들 (0) | 2022.07.12 |
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - 데이터복제 이벤트 처리 Internal HTTP (0) | 2022.07.12 |
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - 데이터복제 이벤트 처리 ( RabbitMQ ) (0) | 2022.07.11 |
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개발) Docker 패키징과 구동 테스트 (0) | 2022.07.09 |