실시간 집계 데이터 처리 프로세스 개선 기록
2년 전 개선작업 시작때 기록 무려 2년 전 입사한지 얼마 지나지 않았을 때 작성한 건데 생각보다 잘 썼다..?? 저때 열심히 살았나보다. 서비스에 라이브 송출 플레이어가 추가되면서 실시간 데이터 처리를 맡게 되었다. 이전에 있던 다른 일반 VOD 재생 데이터들은 관계형 데이터베이스에서 DynamoDB를 사용하도록 프로세스가 수정된 상태였다. VOD 재생 데이터도 실시간 집계라면 실시간 집계였지만 라이브 서비스의 경우 현재 시청자수를 구해야해서 정말로 실시간 집계가 필요했다. 재생 데이터는 5초에 한 번 계속해서 들어오도록 되어있다.기존에는 시간, 날짜 별로 데이터를 쌓고 있었다. 현재 시청자 수의 경우 더 짧은 집계 단위가 필요했고 이를 30초로 정해서 데이터를 쌓기 시작했다.여기서 문제가 발생했는데, 순서가 보장되지 않는 SQS 일반 큐에서 재생 데이터를 저장하는 조건은 해당 uuid에 마지막 재생 시점보다 새로운 재생 데이터의 재생 시점이 이후일 경우이다.날짜,...
Web Component 대신 iframe을 선택한 이유
내가 개발한 페이지에서 커스텀 플레이어를 만들 수 있는 부분만 기존 서비스에 추가하기 위한 작업을 시작했다. 기존 페이지에 영향을 주지 않으면서 컴포넌트를 추가하기 위한 기술을 찾아보니 웹 컴포넌트라는게 있었다.생각보다 오래전부터 존재했던 기술이라 신기했다. 생소한 개념이라 여러가지를 리서치했다.생각보다 종류가 많았는데 그 중 Stencil를 선택했다.프레임워크도 여러가지가 있었는데 Stencil도 프레임워크 같아 보이지만 ‘웹 컴포넌트 컴파일러’라고 한다. 웹 컴포넌트코드를 캡슐화하여 재사용 가능한 커스텀 엘리먼트를 생성하고 웹 앱에서 활용할 수 있도록 해주는 다양한 기술들의 모음이다.아래 세 가지 주요 기술들로 구성된다. Custom elements: 사용자 인터페이스에서 원하는대로 사용할 수 있는 사용자 정의 요소 및 해당 동작을 정의 할 수 있는 Javascript API 세트 Shadow DOM: 캡슐화된 Shadow DOM 트리. 메인 Document...
SOLID 원칙
SRP (Single Responsibility Principle)‘클래스를 변경하는 이유가 한 가지 이상 있어서는 안 된다.’는 말이 있다. 한 개의 클래스가 한 가지 일만 하도록 하는 것은 매우 중요하다. 클래스의 기능이 많아질수록 역할이 불분명해지고 의존하고 있는 모듈들에 어떤 영향을 끼칠지 알 수 없기 때문이다. Bad1234567891011121314class UserSettings { constructor(private readonly user: User) { } changeSettings(settings: UserSettings) { if (this.verifyCredentials()) { // ... } } verifyCredentials() { // ... ...
Code Deploy 배포 자동화 이슈
온프레미스 인스턴스에 작업 codedeploy agent config 파일이 없다는 이슈 register 명령어 사용시 config file이 같은 디렉토리에 생성된다. 1aws deploy install --override-config --config-file ./codedeploy.onpremises.yml --region ap-northeast-2 --agent-installer s3://aws-codedeploy-ap-northeast-2/latest/codedeploy-agent.msi register-on-premises-instance 명령어 사용시 /etc/codedeploy-agent/conf 위치에 conf.onpremises.yml 파일을 만든다. 12345---aws_access_key_id: secret-key-idaws_secret_access_key: secret-access-keyiam_user_arn:...
Step Functions 작성하기
나중에 또 쓸 일이 있을 것 같아서 기록해둔다.SQS에 쌓여있는 Queue를 10초에 한 번씩 처리하도록 했다. Step 10초에 한 번 람다를 실행시키는 Step Functions 1234567891011121314151617181920212223242526272829303132333435363738394041{ "Comment": "Invoke Lambda every 10 seconds", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "index": 0, "count": 6 ...
Ubuntu18.04 CodeDeploy agent cli 설치
AWS 공식 문서에서는 Codedeploy agent 설치시 AWS Systems Manager를 사용할 것을 권장한다. 하지만 나는 온프레미스 서버에서의 간단한 세팅을 원하기 때문에 그냥 cli로 설치하기로 했다. 🥸 설치사용중인 Ubuntu 버전에 따라 설치 커맨드가 달라지고 잘못 입력할 경우 패키지를 지웠다 깔았다 반복하게 될 수 있으니 조심하자. Ubuntu 16.04 이후 버전은 아래의 순서로 설치를 진행하면 된다. Ruby 설치 123sudo apt updatesudo apt install ruby-fullsudo apt install wget CodeDeploy Resource Kit 설치 1234cd /home/ubuntuwget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install# wget...
ElasticBeanstalk yarn 적용 및 Javascript heap out of memory 오류
ElasticBeanstalk에서 Node.js 엔진을 선택하면 default 패키지 매니저가 npm으로 설정된다. 대부분의 경우 npm이든 yarn이든 문제없이 실행되겠지만 내 프로젝트는 npm 실행시 에러가 발생했다. 관련 내용은 짧게 찾아봤는데 나중에 더 자세히 봐야겠다.구글링을 하면 yarn을 설치하여 사용하는 방법은 두 가지가 나오는데 Amazon Linux 이전 버전에서는 prebuild state에 접근하여 yarn을 설치해줬던 것으로 보인다. (.ebextension/yarn.config 파일 작성 )하지만 이 방법은 Amazon Linux 2 machine 에서는 사용할 수 없고, .platform/hooks/prebuild/에 ‘yarn.sh’파일을 작성해줘야 한다. yarn.sh1234567891011121314#!/bin/bash# need to install node first to be able to install yarn (as at prebuild...
CodeCommit, CodePipeline, ElasticBeanstalk을 사용한 CI/CD 구축
CodeCommit 레포지토리는 이미 생성했다고 가정한다.
서비스 운영 서버 분류 (local, dev, stg, prod)
현재 내가 맡고있는 프로젝트는 CI/CD 구축이 되어있지 않고 번거로운 방법으로 배포를 진행중이다. 서비스 특성상 로컬 환경에서는 확인할 수 없는 기능들이 있어 CI/CD 구축의 필요성을 느꼈고 팀에 말씀드렸더니 그러려면 스테이징 서버도 필요하겠다고 하셨다. 스테이징 서버가 정확히 어떤 것이고 왜 필요한지 몰라서 정리해두기로 했다. 서버 분류의 필요성실제 서비스 운영 환경에서는 개발 단계에 따라 서버를 구분해서 운영한다. 로컬 (local) - 개발 (dev) - 스테이징 (stg) - 운영 (prod) 프로젝트의 규모와 성격에 따라 모든 환경을 구축하지는 않는다. 현재 우리 서비스의 경우 스테이징 서버 없이 세 단계로 이루어져있다. 서버 분류local개발 및 테스트 환경에 셋업 된 개발자 PC의 서버 환경이다. dev테스트용 서버로 개발자가 접근하여 기능을 테스트 할 수 있는 서버이다. 반영하기 이른 태스크들이나 로컬 서버에서 확인하기 어려운 이슈등을 확인하기 위해...
Ubuntu14.04 CI/CD 구축
Codedeploy agent 설치agent 파일을 설치한다. 12wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/installchmod +x ./install ruby 설치 후 agent를 설치한다. 이 때 ruby 버전 2 이상이 필요하므로 레포지토리를 따로 추가 후에 설치해야 정상 진행이 가능하다. 12345sudo apt-add-repository ppa:brightbox/ruby-ngsudo apt-get updatesudo apt-get install ruby2.3 ruby2.3-devruby -v # ruby 2.3.8p459 (2018-10-18 revision 65136) [x86_64-linux-gnu]sudo service codedeploy-agent status # 설치 확인