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

54
오오 오오오 오오오 오오 오오 오오 오오오 오오오 오오 오오 오오오 오오 오오 오오오 오오 오오 NCSOFT 김김김
  • Upload

    -
  • Category

    Software

  • view

    256
  • download

    5

description

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

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

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

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

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

간단하게 끝