오늘 할 일
Introduction Cloud Computing 4주차 - 1
클라우드 컴퓨팅 애플리케이션 아키텍쳐 #2
하이브리드 클라우드 : 온프레미스 프라이빗 클라우드 + 서드파티 퍼블릭 클라우드로 형성한 단일 인프라 컴퓨팅 환경
예를 들어 전자 메일을 공급자, CRM, 인프라로 나누어 다른 다른 클라우드 사용을 하고, 이를 혼용해 사용할 수 있다.
하이브리드 혹은 멀티 클라우드 사용 사례
꽃 배달 서비스의 1년 동안의 서비스를 시각화 하면, 시간마다(계절마다) 수익이 다를 것이다. 만약, 수익이 최고일 때(주문, 접속량이 최고일 때)를 기준으로 인프라를 확장한다면 초기 비용, 관리비가 높을 것이다.
아니라면, 클라우드 서비스를 이용해 워크로드에 응답해 규모를 확장하고, 필요하지 않을 때 리소스를 자동으로 프로비저닝 해제하는 방법을 사용할 수도 있다.
유럽에 서비스 기반을 둔 청구 API와 보상 프레임워크를 가진 웹 UI가 있다고 할 때, 유럽에서는 이 서비스가 만족되지만 미국에서는 추수감사절 같은 날에 시스템이 무너진다고 한다. 이 서비스는 여러 클라우드 환경에서 애플리케이션을 구성하여
하이브리드 클라우드 혹은 멀티 클라우드 아키텍처를 활용하기로 한다. 물론 미국의 데이터 센터를 이용한다. 그런데 보상 프레임워크가 유럽 측에 머물기를 원한다면, 청구 API와 UI기능만 북미 또는 미국의 데이터 센터로 선택한 클라우드 플랫폼으로 이동할 수 있다. 이를 통해 부분 개선해가면서 미국 공휴일에 대한 대비책을 마련할 수 있다.
이 예시에서 꽃 배달 서비스는 하이브리드 또는 멀티 클라우드 아키텍쳐를 사용하여 글로벌 수준으로 확장할 수 있다는 말이다.
AI, 현대화에도 적용되는데 하이브리드 멀티클라우드를 채택하면 특정 벤더의 클라우드 플랫폼에 종속되지 않도록 하고 필요에 따라 한 클라우드 플랫폼에서 다른 플랫폼으로 워크로드를 유연하게 움직일 수 있기 때문이다.
---------------------------------------------------------------------
마이크로 서비스 아키텍쳐
같은 팀 내에서 서로 다른 컴포넌트에 대해 다른 런타임 환경을 사용할 수 있다. 여러 개발자가 독립적으로 작업하므로 더 효율적으로 업데이트할 수 있다. 너무 많은 부하를 주는 애플리케이션은 독립적으로 확장해 전체를 확장할 필요가 없으므로 낭비와 비용을 줄일 수 있다.
예를 들어, 온라인 스포츠 스트리밍 미디어 서비스가 있다고 할 때, 그 서비스는 MSA를 사용한다고 하자. 이 프로그램을 만들 때, 처음부터 모든 코드 줄을 만들 필요가 없고, 검색, 추천, 고객 등급, 제품 카탈로그 등의 기능을 핵심 기능으로 분류해 독립적으로 개발되고, 클라우드 환경에서 함께 작동해 애플리케이션을 만든다.
컨테이너는 MSA에 대한 배포 방법으로 필요한 곳으로 코드를 전달한다. 컨테이너는 플러그 앤 플레이어라 하나의 MSA가 다른 애플레케이션에 대해 영향을 주지 않는 경우 다른 곳에 대한 영향을 생각할 필요 없이 다른 애플리케이션에 넣을 수 있다.
MSA1은 컨텐츠 카탈로그이다. 해당 개발자 팀은 컨텐츠를 설명하는 메타데이터로 컨텐츠를 구성한다. MSA2는 검색 기능이다. MSA3은 추천이다. 이 세 가지 MSA는 별도의 컨테이너에 있고, 애플리케이션을 형성한다. 그러나, 그 전에 서비스 검색을 통해 서로를 알아야 한다.
서비스 검색은 MS가 다른 MS가 서로 통신할 수 있는 로드맵을 만든다. MS가 서로를 찾으면, API를 사용하여 통신한다.(축구 팀을 검색해(MSA2) 카탈로그(MSA1)으로 넘겨준다.) 그리고 시청 기록, 선호, 지리적 지역 및 인구 통계학 등을 적용해 AI를 통한 추천(MSA3)을 해 좋아하는 팀의 최신 경기를 바로 찾아낸다.
MS 접근 방식은 개발자가 애플리케이션을 병렬로 빠르게 혁실할 수 있고, 사용자가 실제로 관심있는 것에 집중할 수 있도록 도움을 준다.
--------------------------------------------------------------------
서버리스
클라우드 공급자가 확장, 예약, 패치, 프로비저닝과 같은 일반적인 인프라 고나리 작업에 대한 책임을 부담(서버를 사용하지 않는다는 것이 아님).
서버 프로비저닝, 애플리케이션 스택, SW설치, 인프라 관리 등의 운영이 필요 없고, 요청 당 주문형 코드만 실행하여 투명하게 확장된다(요청마다 새 인스턴스). 최종 사용자가 사용중인 리소스에 대해서만 비용을 지불하고, 유휴 용량에 대해서는 지불하지 않는다.
시나리오 예시 - 웹사이트의 프론트엔드와 스토리지 사이에서 서버리스 플랫폼을 구축해 개별 기능을 수행할 수 있다.
웹사이트의 텍스트 파일 -> 서버리스 앱 -> 앱에서 여러 언어로 번역 -> 클라우드 스토리지에 저장 -> 링크를 사용자에게 제공
IBM클라우드. AWS, MS Azure를 주로 사용.
서버리스가 모든 애플리케이션 시나리오에 적합한 것은 아니다. 따라서, 애플리케이션 특성을 평가하고 애플리케이션이 서버리스 아키텍쳐 패턴에 맞는지 확인해야 한다.
서버리스 아키텍쳐는 데이터, 이벤트 처리, IoT, MSA, 모바일 백엔드 등 자동 확장, 신속한 프로비저닝, 유휴 시간 동안 요금 부과 없음 등의 측면을 잘 고려해야 한다.
또, 데이터 보강, 변환, 유효성 검사, 정리, PDF 처리, 오디오 정규화와 같은 구조화된 텍스트, 이미지, 비디오, 오디오 데이터 작업에 적합하다.
비즈니스 데이터스트림, IoT 센서 데이터, 로그 데이터, 금융 시장 데이터 등 모든 종류의 데이터 스트림(현재 말하는 듯)에 적합하다.
서버리스의 과제
워크로드에 응답하여 확장, 축소하도록 설계되었지만 기존 서버 환경을 관리하는 장기 실행 프로세스가 더 간단하고 비용 효율적일 수 있다. 공급업체 종속성에 문제가 생길 수 있다. 워크로드에 따라 확장 및 축소되므로 0부터 시작해야 하는 경우가 있다.
오늘 배운 파이썬 테크닉
a, b, c = map(str, input().split()) 이런 식으로 들어온 한 줄의 문자열을 각각 잘라서 a, b, c로 넣어줄 수 있다.
백준 1065번
내 풀이
import sys
def run():
num = int(sys.stdin.readline())
if num < 100:
cnt = num
elif num == 1000:
cnt = 144
else:
cnt = 99
for i in range(100, num + 1):
a, b, c = map(int, str(i))
if a - b == b - c:
cnt += 1
print(cnt)
if __name__ == "__main__":
run()
다른 사람 풀이
print(sum(i<100 or i//10%10*2==i%10+i//100 for i in range(1,int(input())+1)))
2941
내 풀이
import sys
def croatia():
s = sys.stdin.readline().rstrip()
cro = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]
for c in cro:
s = s.replace(c, "a")
print(len(s))
if __name__ == "__main__":
croatia()
다른 사람 풀이
c=input().count;print(c('')-1-sum(map(c,['-','=','nj','lj','dz='])))
이 사람 풀이에서 c를 그냥 찍어보니까
<built-in method count of str object at 0x0000029921542DF>
가 출력됐다. c('')를 해야 9가 출력된다.
1316번
내 풀이
import sys
def group():
num = int(sys.stdin.readline())
cnt = 0
for _ in range(num):
s = sys.stdin.readline().rstrip()
cnt += check(s)
print(cnt)
def check(s):
for i in range(len(s) - 1):
check = True
if s[i] != s[i + 1]:
check = False
for j in range(i + 1, len(s)):
if not check and s[i] == s[j]:
return 0
return 1
if __name__ == "__main__":
group()
다른 사람 풀이
result = 0
for i in range(int(input())):
word = input()
if list(word) == sorted(word, key=word.find):
result += 1
print(result)
정렬시키고 나서 비교할 생각은 하지 못했다. 이게 더 좋은 코드 같다.