2011-12-22 2 views
0

사용자 요청을 받아서 MYSQL 데이터베이스에 넣는 웹 응용 프로그램이 있습니다. 이제 일반적인 사용자 요청은 완료하는 데 상당한 시간이 걸리는 워크 플로를 따라 수행해야합니다. 이 문제를 해결하려면 MYSQL 테이블을 계속 수신하는 비동기 프로세서가 있어야합니다.Java에서 비동기 프로세스 트리거

무한 루프에서 MYSQL 테이블을 폴링하면 응용 프로그램이 배포 된 상자의 CPU 사용량이 급격히 높아져 종종 사용할 수없는 것으로 나타났습니다.

MYSQL 데이터베이스에 활성 요청이 없을 때마다 '어느 정도'시간 동안 비동기 프로세스가 잠자기하는 옵션이 있지만 마지막 수단으로 사용하고 싶습니다.

단일 요청을 처리하는 데 소요되는 워크 플로가 소요되는 시간과 백 엔드가 발전 할 수 있도록 프런트 엔드에서 처리를 분리해야하기 때문에이 프로세스를 동기식으로 만드는 것은 옵션이 아닙니다.

비동기 프로세스를 트리거하여 CPU 사용량을 줄이고 비동기 프로세서에서 최적의 응답 시간을 얻을 수있는 지 알아 보려합니다.

모든 조언을 부탁드립니다.

감사 p1ng

+1

이 질문을 구성한 방법에 따라 두 개의 개별 응용 프로그램이 있음을 알 수 있습니다. 방금 데이터베이스에 삽입 된 데이터를 비동기 적으로 처리하는 다중 스레드 웹 응용 프로그램을 가질 수없는 이유가 있습니까? – Carth

+0

모든 실제적인 목적을 위해 프론트 엔드와 백엔드는 서로 다른 응용 프로그램으로 간주 될 수 있습니다. 내가 멀티 스레드 방식으로 갈 수없는 이유는 각 요청을 처리하는 데 관련된 워크 플로가 단수이고 스레드가 아닌 리소스를 사용하고 요청 단위로 해당 리소스를 차단하고 싶지 않기 때문입니다. 또한 비동기 프로세서는 계속 발전하고 있으며 디커플링에 대한 필요성은 앞으로도 외부 API 호출을 위해이를 열 계획이기 때문에 또한 필요합니다. – ping

+0

CPU 사용량이 급증하는 이유를 자세히 설명해 주시겠습니까? 백 엔드를 멀티 스레드로 만드는 것 외에, 왜 처음부터 문제가 있는지 이해하지 않고 무엇을 할 수 있는지를 알지 못합니다. –

답변

1

옵션이 데이터베이스에 요청을 저장하고 시스템에서 이벤트의 어떤 종류를 보내 (예. JMS 메시지 또는 java.util.concurrent의 구조를 사용하여)하는 것입니다. 명령을 읽고 실행하는 프로세스는이 신호로 깨어나 데이터베이스에서 데이터를 가져 와서 평소와 같이 처리 할 수 ​​있습니다.

이 방법을 사용하면 CPU 사이클 폴링 아직 사용할 수없는 데이터를 낭비하지 것입니다, 당신은 때문에 폴링 지연의 부재에 더 많은 반응 할 것이다.

+0

감사합니다. JMS는 내가 취하려고하는 경로입니다. – ping

1

비동기 프로세스를 TCP 소켓 또는 이와 유사한 것으로 읽을 수 있습니다. 비동기 프로세스는 I/O 차단을 기다려야합니다. 그런 다음 기본 프로세스에서 테이블을 업데이트 한 후에 비동기 프로세스로 메시지를 보낼 수 있습니다. 데이터베이스의 트리거에서 메시지를 보낼 수도 있습니다.

+0

이것은 흥미 롭습니다. 방아쇠에서 메시지를 어떻게 보내시겠습니까? 예나 링크가 있습니까? – perissf

+0

@perissf 링크를 클릭하면 http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html#qandaitem-B-5-1-10 할 수 있음을 알 수 있습니다. –

1

일반적으로 테이블을 확인하기 위해 폴링 방식을 사용하지 않는 것이 좋습니다. 다른 일정으로 다른 이벤트를 폴링해야 할 때 어떻게됩니까? 앞으로 여러 이벤트가 필요하다고 생각한다면 비동기 작업을위한 메시지 대기열을 조사하는 것이 좋습니다.

하지만 지금 당장 폴링 기반 접근 방식을 사용해야하는 경우 - 비동기 프로세스를 잠자기 상태로 만드는 것에 대한 추론을 완전히 이해하지 못합니까? 왜 당신의 프로세스가 무한 루프에서 실행되지만 아무것도하지 않고 모든 CPU 리소스를 소비하기를 원할 것입니까? 왜 비동기 프로세스가 특정 간격으로 실행되지 않습니까? 이 폴링 간격을 구성 가능하게 만들 수 있습니다.

1

FutureTask Java API를 사용하여이를 수행 할 수 있습니다. that blog entry을 참조하십시오.

또는 단지 new Thread(YourRunnable).start() 일 수도 있고 YourRunnable의 상태 변수를 사용하여 작업이 완료되었는지 확인할 수 있습니다.

관련 문제