오픈 소스를 활용한 게임 배치 플랫폼 개선 사례

54
오오 오오오 오오오 오오 오오 오오 오오오 오오오 오오 오오 오오오 오오 오오 오오오 오오 오오 NCSOFT 김김김

Upload: -

Post on 10-Dec-2014

256 views

Category:

Software


5 download

DESCRIPTION

Spring Batch 및 Spring 프로젝트를 활용한 게임 플랫폼 배치 개선 사례 공유

TRANSCRIPT

오픈 소스를 활용한 게임 배치 오픈 소스를 활용한 게임 배치 플랫폼 개선 사례 플랫폼 개선 사례

NCSOFT 김형석

OVERVIEW

• 구 배치 환경 소개• 개선 방향 • 솔류션 평가 및 선정• 계획 및 일정• 개선 결과

배치 구성도

HTTP

XML

Game API

BATCH SERVER

WEB DB

구 배치 수집 현황

• 스케쥴링 : RAC XML 에 명시된 Quart JOB 을 수행• 마샬링 : Xstream• 일 수집 데이터 평균 건수 : 10 만건 • 배치 JOB 건수 : 9 건 • JOB 이력 관리 단일 테이블을 통해 전체 JOB 이 수행 여부 체크 • ( 조건 : 완료가 안되었거나 작업 완료후 4 시간 지난경우 )

문제점

• 특정 시간 혹은 작업 이력테이블상에선 알수 없는 이유로 인해 배치가 동작이 안됨

• 특정 JOb 구동시 3 시간 30 분 이상 소요가 되며시간이 지날수록 점차 증대

• 재 구동시에도 반복적인 현상 발생되며 톰켓상 오류로는

배치 상세 문제 확인이 어렵고 테스트가 불가능 .

장애 및 지연 원인

• 1 건 처리시마다 Sleep 구간을 두어 시간이 지연

• 대량의 데이타 등록후 데이타 미삭제로 인해 인덱스 단편화 발생되어 성능 하락

• 특정 JOB 실패시 작업 이력 테이블 삭제가 되며 해당 JOB 재시도가 아닌 전체 배치 재 구동되어 시간 지연

• 데이터 한건마다 트랜잭션을 수행하며 대량 데이터 일괄 처리를 위한 ORM BATCH 기능 부재

조치 사항

• 시간 체크주기를 3 시간에서 4 시간 으로 임시 증가

• 배치를 재 구동후 전체가 완료될때까지 수동 모니터링

• JOB 별로 하나씩 처리후 Tomcat Restart 후 반복 확인

근본적인 문제

• 로깅 및 메세지 , 예외 처리 문제 – 특정 배치 JOB 에 대한 실행 , 시작 , 종료 , 성공 여부 , 오류 사항에 대한 로그가

없어서 명확한 원인 파악이 불가능

• 모니터링 시스템에 대한 부재 – 배치 오류시 개발자에 의한 확인보다는 장애 확인요청에 의한 대응

• 일괄 처리 정책 미흡 – 대량의 데이터 처리시 DB 에 영향을 최소화 하며 일정 단위로 나누어 한꺼번에

처리하는 방법이 필요함

• 부분 처리에 대한 고려 필요 – 실행 중인 작업이 중간에 에러 발생시 전체 작업을 재시도하기때문에 진행 부분에 대한

파악이 어려움

• 테스트 환경의 어려움 : – 처리되는 전체작업을 하나의 단위로 처리하는 경우가 많기 때문에 에러 발생시

디버깅에 어렵다 .

OVERVIEW

• 배치 소개• 개선 방향 • 솔류션 평가 및 선정• 추진 계획 • 개선 결과

개선 방향

사용자와의 상호 작용

• 일반적인 온라인 Application 과 달리 사용자에 의해 실행이 결정되지 않는다 .

• 주어진 시간외에 독립적으로 배치를 실행 지원• 실시간 동작되는 배치를 업무 필요상 중단 혹은

재시작을 손쉽게 할수 있어야 한다 .

정해진 시간내에 실행이 완료

• 사업 및 기획 요구 특성에 따라 수집 데이터 증가되고 있으며 전형적인 CNP 패턴으로 유사 코드 반복으로 인해 정책 반영이 느림

• WAS 위에 동작되는 어플리케이션으로 서로 다른 배치가 영향을 주고 받아 성능 문제 발생

• 업무 로직 개선과 배치 분리 개선 병행

대량의 데이터를 다루기 위한 성능 최적화

• 배치 처리 에러 발생시 전체가 롤백됨• 트랜잭션 단위가 껀별로 진행되어 성능지연 • 전체 ( 성공 & 실패 ) 단위로 배치가 구성되어 부분 처리

미흡

• FILE 및 DB I/O 최소화 및 프로그램 최적화 • 병렬 처리

관리 시스템 구축과 기반 설계

• 모듈 활용의 부족• ORM BATCH 기능 부재 • 장애 관련 모니터링 시스템 부족

• 배치 상세 모니터링 시스템 구성• 아키텍처 모듈 최적화 • 배치 정책 ( 재시도 , 재시작 , 건너뛰기 ) 수립 • SPRING 및 오픈 소스 최대 활용• Jenkins 활용한 배치 모니터링 시스템 구성

배치 서비스 표준화

• 배치에서의 정보 항목등이 명확하지 않음 – 작업주기 , 작업 유형 , 작업 현황 정의

• 배치 기술 유형이 불분명하고 , 기술 유형별로 구현 방법이 상이– 입출력 리소스 추상화 , 사용 도구 , 처리 흐름 , 적용

기술

배치 서비스 표준화

• 개인역량에 따라 각기 배치 어플리케이션의 보안 , 성능 , 자원관리 개발이 이루어지고 품질 확보가 어려움

• 기존 Batch SYSTEM– Linux 의 Crontab 을 이용한 Shell Script– Windows 의 작업스케쥴러를 이용한 batch script– Web Service 안에 Web Call 호출 방식– Web Service 안에 QuartzJob 이용 – 자체 배치 플랫폼 개발– Legacy (C, C++, php, ETL, rsync, perl, python, Pure Java)

배치 서비스 표준화

• 트랜잭션에 대한 깊은 고민 부족– 지나치게 긴 트랜잭션은 DB 자원 (Rollback Segement)

한계 부딪칠 가능성 높다– 짧은 트랜잭션은 좋은 성능 보장이 어려움

DB 및 운영 특성에 맞게 일정 사이즈로 데이터를 균일하게 Fetch 하여 적정횟수 만큼 Commit

문서 참고 : http://helloworld.naver.com/helloworld/1247

배치 서비스 표준화 개선 절차

• 비즈니스 변화에 대한 빠른 대응과 저 비용으로 고품질을 만들수 있어야 한다 .

• 유형별로 빨리 만들어 낼수 있어야 한다 . • 반복되는 로깅 , 보안 , 예외처리 , 신경 끄기 • 개발자에게 노출이 필요한 부분 최소화• 배치 기반 특성이 충분히 반영되어야 한다

OVERVIEW

• 배치 소개• 개선 방향 • 솔류션 평가 및 선정• 추진 계획 • 개선 결과

솔류션 평가 및 선정

• SPRING BATCH • SPRING DATA JPA• SPRING BOOT• JdbcTemplate• Java Configuration

SPRING BATCH + ALPHA

• Run Tier : 실행과 스케쥴링 담당 ( Spring Boot, Jenkins)• Job Tier : 전체적인 JOB 수행 책임 (Spring Batch)• Application Tier : JOB 을 수행하는 필요한 컴포넌트

(Spring Data Jpa, Java Configuration)• Data Tier : DataBase, Flat, XML 등 물리적 데이터 리소스

SPRING BATCH

• Spring 의 기술력과 컨설팅 회사인 Accenture 의 대형 금융권 배치 기술 아키텍처의 경험이 녹여듬

• 자바 환경에서 사실상 표준인 Spring 활용

• 국내 및 해외 유수 보험 및 금융기관에서 채택되어 전사 표준 배치로 사용중

• Spring 추상화 기술로 특정 기술에 종속적이지 않음

SPRING BATCH

AmqpItemReader

FlatFileItemReader HibernatecursorItemReader

IbatisPaingItemReader

JdbcCursorItemReader

JmsItemReader

JpaPagingItemReader

ListItemReaderMongoItemReader Neo4jItemReader

RepositoryItemReaderResourceItemReader

StaxEventItemReader StoredProcedureItemReader

MultiResourceItemReader

SPRING BATCH

문서 참고 : http://docs.spring.io/spring-batch-old/1.1.x/spring-batch-docs/reference/html-single/index.html

SPRING BATCH

• 혼자 이해하던 복잡한 Legacy 배치를 배치 프레임워크 변환후 동료들과 공유 가능

• JOB 문제시 추적 범위가 좁혀져 오류 발생시 원인파악이 쉬움

• 코딩량이 이전에 비해 ½ 로 줄어듬

• 배치 로직 구현이 단일건 대상으로 이해가 쉬움

SPRING DATA JPA

• 도메인 클래스에 대한 투명한 감시 및 관리• 페이징 지원 , 다이나믹 쿼리 수행 , 데이터 엑세스 코드를 도메인에 통합• ANNOTATION 으로 테이블 매핑

SPRING DATA JPA

SPRING DATA JPA

• 반복적인 쿼리 노가다 삽질 작업 제거 • 엔티티 기반 도메인 설계에 집중 • 비즈니스 로직 구현 최소화 • 인터페이스 정의만 하면 알아서 구현체 생성• 변경 사항에 대한 개발 기간 단축 • 코딩량이 이전의 ½ 로 줄어듬 • 손쉬운 테스트 코드 작성

SPRING BOOT

• Spring 프로젝트 개발을 빠르고 다양한 방법으로 시작할수 있도록 한다 .

• 설정을 위해 별도의 코드 구현이 없으며 XML 이 필요치 않다 .

• Tomcat 과 Jetty 가 내장됨

• 임베디드서버 , 시큐리티 , 헬스체크 , 외부 설정 연계등 개발의 모든 사이클을 제공한다 .

SPRING BOOT

spring-boot-starter-actuator spring-boot-starter-amqp spring-boot-starter-aop

spring-boot-starter-batch spring-boot-starter-data-elasticsearch spring-boot-starter-data-gemfire

spring-boot-starter-data-jpa spring-boot-starter-data-mongodb spring-boot-starter-data-rest spring-boot-starter-data-solr spring-boot-starter-freemarker spring-boot-starter-groovy-templates spring-boot-starter-hornetq spring-boot-starter-integration spring-boot-starter-jdbc spring-boot-starter-jetty spring-boot-starter-log4j

spring-boot-starter-logging spring-boot-starter-mobile spring-boot-starter-parent spring-boot-starter-redis spring-boot-starter-remote-shell spring-boot-starter-security spring-boot-starter-social-facebook spring-boot-starter-social-linkedin spring-boot-starter-social-twitter spring-boot-starter-test spring-boot-starter-thymeleaf spring-boot-starter-tomcat spring-boot-starter-velocity spring-boot-starter-web spring-boot-starter-websocket spring-boot-starter-ws spring-boot-starter

Boot Application Starter

SPRING BOOT

ID 설명

Autoconfig 자동 설정되거나 설정되지 않는 목록들과 그 이유

Bean 어플리케이션에서 선언한 Bean 목록들

Configprops Properties 로 선언된 목록들

Dump Thread Dump

Env 시스템 환경 및 어플리케이션 환경 목록

Health 어플리케이션 상태 체크

Info 어플리케이션 정보

metrics 어플리케이션의 메트릭스 정보

mappings @RequestMapping 에 매핑된 경로 정보

shutdown 어플리케이션 종료

trace Http 요청 정보

Endpoints

SPRING BOOTEndpoints Example

SPRING BOOT

@Configuration@EnableAutoConfiguration@ComponentScanpublic class Start { public static void main(String[] args) {

if (args.length == 0) { args = new String[]{ "date=" + getCurrentDate()}; }

SpringApplication.run(AppConfig.class, args);}

Magic

JAVA CONFIGURATION

스크롤의 압박

JAVA CONFIGURATION

OVERVIEW

• 배치 소개• 개선 방향 • 솔류션 평가 및 선정• 추진 계획 • 개선 결과

추진 계획

13 03 30 08 20 2819

3월 4월 5월

2014

Start With GitHub

1차 Prototype 구현 성능 테스트

2차 PrototypeSpring Data JPA 연동

Major JOB 완료및 모듈 구성

Spring Boot 연동 망별 성능 테스트

Jenkins 을 활용한 스케쥴링

End With Live Deploy

Timeline

OVERVIEW

• 배치 소개• 개선 방향 • 솔류션 평가 및 선정• 추진 계획 • 개선 결과

속도 및 코드 개선

배치 수행 시간 코드 라인 수

Lombok 제외

운영 및 모니터링 개선

• Jenkins 을 활용한 스케쥴링 자동화– Job failure, Load balancing – Web UI 에서 로그 확인– Retry , 노드 확장성

Jenkins Spring Batch JOB

운영 및 모니터링 개선

스케쥴 관리

실행 스크립트

Profile 설정

운영 및 모니터링 개선

• JOB 실패시 DB 이력

운영 및 모니터링 개선

• Spring Batch Listener 를 활용한 배치 상세 로그 관리– Job 별 수행건수 , 수행시간 , 에러메세지 , 배치 상태 , 커밋 , 롤백 , 파라미터 관리 , Skip, 에외 처리 기록…

운영 및 모니터링 개선

• spring.batch.job.names : Context 에 등록된 Bean 중 해당하는 JOB 만 명시적으로 선언하여 사용할지 선택하며 comma 로 구분

• spring,batch.job.enabled : Spring Ruuner 가 구동시 모든 JOB 을 수행할지 여부 • spring,batch.initializer.enable : 데이타베이스 플랫폼에 해당하는 SQL 초기화

스크립트를 수행 여부

#SPRING BATCHSpring.batch.job.names=armorItemXmlToDbJobSpring.batch.job.enabled=trueSpring.batch.initalizer.enabled=false

Spring Boot 를 활용한 어플리케이션 생성 , JOB 손쉬운 관리

테스트 및 유지보수 개선

• 망별 환경설정을 통해 XML , URL Resource 자동 분기– Spring.profiles.active, spring.core.io.resource

테스트 및 유지보수 개선

• 단계별 JOB 수행 및 테스트 코드를 통해 빠른 테스트 진행 및 선택적 확인 가능 – Full Test Code Support

테스트 및 유지보수 개선

• SPRING DATA JPA 를 통한 반복적 쿼리 작업 제거

NO

테스트 및 유지보수 개선

• Web Project 에서 배치를 제거하여 관심 분리 • 유지보수 집중화

BATCH

WEB WEB

BATCH

로직 개선

• 쿼리 및 비즈니스 로직 최소화

MVC 패턴

SPRING DATA

SPRING BATCH

SPRING DATA

Domain -> Service -> ServiceImpl -> DAO -> DaoImpl -> 쿼리

Domain -> Service -> Repository

Domain -> Processor

배포 개선

With Spring BOOT

고려사항

• 코드양은 줄어드는 반면 개념이해는 필수• SPRING 프로젝트들은 계속 진화중• SPRING-BATCH 는 동일 JOB Repository 에 동일한 JOB-NAME 과

JOB-PARAMETER 로 JOB Instance 생성 불가• BATCH JOB 은 성격이 다양하기 때문에 SPRING 에서 다양한 해결

방법을 지원한다 • 바퀴를 재 개발하지 말고 오픈 소스를 찾아서 사용하자• 장애 발생을 최소화 하고 TestCase 를 통해 사전에 문제를 예방• 테스트가 어느 자리 , 어느 망에서도 쉽게 재현되도록 준비

참고

• http://blog.skcc.com/932 • http://www.manageability.org/blog/stuff/open-source-etl • http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/

reference/htmlsingle/#boot-features-external-config• http://www.slideshare.net/knight1128/batch-8508863• http://www.dbguide.net/knowledge.db?

cmd=view&boardUid=128487&boardConfigUid=20&boardStep=0

DEMO

• https://github.com/ghostflare76/spring-batch-extension/tree/master/spring_batch

배치는 오픈소스 + 스프링 조합으로

간단하게 끝