Skip to content

SNS 새소식 발행하기(Spring scheduler + Cassandra) -2

2012/01/18

앞에 글은 Cassandra의 CF를 설계하고 요청에 대해 아주 대략적인 시퀀스 다이어그램을 통해 어떻게 동작하는지를 알아봤습니다. 그리고 이번 글에서는 응답시간을 높이고 부하를 분산시키기 위해 Spring scheduler를 통한 비동기식 처리 방법에 대해 확인해 보겠습니다.

Scheduler는 일정시간 마다 특정한 작업(메소드)를  반복적으로 실행할때 사용합니다.
그래서 우선 Feed를 저장하기 위한 요청이 들어오면 실제로 저장하는 작업을 하는 것이 아니라 저장해야하는 데이터를 Serializable을 implements 한 Domain에 저장을 하고 그 도메인을 ObjectInputStream을 통해 파일로 저장하는 Serializer를 이용해서 분산된 여러 디렉토리에 시간을 이름으로 해서 파일로 저장합니다.

그리고 파일로 저장이 끝나면 바로 성공을 리턴해주어서 응답시간을 기존에 DB에 저장하고 하던 모든 작업이 끝나고 나야서 결과를 리턴해주던 방식보다 많이 줄이게 됩니다.

저장된 파일들은 일정시간마다 일정개수 만큼 저장된 시간순으로 읽어 들여서 기존에 하던작업(DB에 저장하고 노티를 보내는)을 하면 됩니다.

우선 applicationContext.xml 에 아래와 같은 내용을 추가합니다.

<task:annotation-driven scheduler="newsScheduler" /> // 애노테이션(@Scheduled) 방식을 사용하기 위해 정의합니다.

<task:scheduler id="newsScheduler" pool-size="10"/> //scheduler의 설정값을 정의합니다.(10개의 스레드 풀을 갖음)

그리고 Processor와 Woker를 작성합니다.

NewsProcessor.java
public class NewsProcessor implements Processor{
@Autowired
	@Qualifier("newsWorker")
	private Worker newsWorker;
	//멀티스레딩 어플리케이션을 위한 integer
	private final AtomicInteger counter = new AtomicInteger();

	//schedule 어노테이션 1초에 한번씩 실행하게 됩니다.
	@Scheduled(fixedRate = 1000)
	public void process(){
		newsWorker.work(counter.intValue());
		if (counter.intValue() >= Constants.NEWS_QUEUE_COUNT) {
			//NEWS_QUEUE_COUNT 보다 크면 counter를 다시 0으로 만듭니다.
			counter.set(0);
		} else {
			//counter 증가
			counter.incrementAndGet();
		}
	}
}
NewsWorker.java
public class NewsWorker implements Worker {
	public void work(int queueId){
		//queueId에 해당하는 폴더에 파일을 읽어서 unSerialize 하고
		//그 도메인을 가지고 DB에 저장하고 노티를 발송하는 등의 일을 수행합니다.
		boolean result = unSerializeNews(queueId);
	}
}

결국 스케줄러는 1초에 한번씩 차례대로 폴더를 뒤져서 파일이 있을 경우 unSerialize를 수행하 DB에 저장하고 노티를 발송하는 작업을 하며 이 작업은 동시에 최대 10개까지 수행합니다.

여기서 중요한 점은 스레드 풀의 사이즈가 크고 스케줄링 간격이 짧을 수록 처리할수 있는 데이터가 많아 지기 때문에 전체적인 속도는 빨라지겠지만 시스템에 충분한 테스트를 통해 적절한 값을 찾아야 합니다.

No comments yet

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: