태그 : spring
2008/06/16 Spring batch와 Spring integration의 만남 [2]
2008/05/15 batch job에서의 바람직한 트랜잭션 처리 방식
벌써 3.0에 대한 이야기가 나오고 있습니다.
잘 하면 2008년 4분기 정도에 GA(General Availability) release(일반사용 가능 버전)가 나온다고 하는군요. Spring Core 모듈이 Java 5에 대해 본격적으로 의존하고 이제 더 이상 Java 1.4에서는 돌아갈 수 없다고 합니다.
이미 어느 정도 윤곽이 잡혀있듯이, Spring MVC에서 REST에 대한 full scale 지원이 포함된다는군요. 그리고 Spring batch에서 지원되었던 repeat, retry, resume의 개념들과 Spring WS의 Spring OXM 등이 보다 상위 모듈에서 포함되어서 제공될지도 모르겠습니다. 또, Junit 3.8 기반의 통합테스트 클래스들은 deprecated로 표시될 것 같습니다. (아마도 AbstractSingleSpringContextTests같은 클래스들을 이야기하는 것이겠죠?)
# by | 2008/06/17 17:58 | 개발 이야기 | 트랙백(1) | 덧글(0)
Spring portfolio의 일부 중 최근에 관심을 제가 관심을 가지고 있는 Spring batch와 Spring integration을 연결한 프로토타입 코드들이 나왔습니다.
Spring batch form에 최근에 올라온 글입니다.
그리고 6월 18일에 이 것을 주제로 한 온라인 세미나 같은것이 있나 보네요.
이 코드들은 Java 5를 사용하기 때문에 Spring batch 1.1 정식 배포판에는 들어가지 않을거라고 합니다. Spring batch 프로젝트에서는 2.0전까지 Java5 으로 가지는 않을거라고 하네요.
SpringOne 08의 Spring batch 주제의 발표에서도 관련 내용이 들어갈 것 같네요. Spring batch와 Spring integration의 convergence가 있는 것으로 보인다는 언급이 있습니다.
Spring batch와 Spring WS, Spring Integration은 얽히고 섥힌 관계라고 보입니다. Spring integration의 Web Service Adapters에서 Spring Web Service를 사용하고 있고, Spring batch에서도 XML파일 처리에 Spring WS의 일부인 Spring OXM를 통한 위임처리를 할 수 있습니다. 그리고 위와 같이 Spring integration는 Spring batch도 연결시켰군요.
Spring batch의 Job은 Spring Application Flatform을 통해서 OSGi 번들로도 실행가능하게 되었습니다.
향후 버전에서는 더욱 더 배치에 특화된 기능들이 추가될 것이라고 하네요.
Spring batch + Spring Integration + Spring WS + Spring Application Flatform.. 그 미래가 어떻게 될지 정말 기대가 됩니다.
가끔 google이 하는 짓들을 보면 그런 생각이 들었는데, 스프링도 이러다보면 세계정복을 하는게 아닐지 모르겠습니다.;
일반적인 온라인 어플리케이션에서는 사용자가 보내는 event 한번에 하나의 트랜잭션을 묶어서 처리합니다. 하지만 배치처리에서는 하나의 처리가 하나의 트랜잭션으로 관리되는 것은 때로는 문제가 될 수 있습니다.
몇 만 건 이상의 행과 같이 대용량 데이터를 다루는 경우에는 roll back segment 같은 공간의 부족현상이 생길 수도 있습니다. 그리고 상대적으로 긴 처리 시간동안 DB에 lock을 걸리게 해서 전체 시스템에 병목을 만들 수도 있습니다. 사용자가 많은 웹어플리케이션이 동시에 접근하는 DB에서 배치처리를 돌릴 때는 이를 더 염두에 두어야 할 것입니다.
또, 데이터가 건마다 독립성을 가지고 있는 경우라면 한 두건의 처리실패 때문에 앞에 성공한 건들도 다 Roll back이 되어버린다면 더 많은 건의 데이터가 의도하지 않은 상태로 오래 유지될 수 있습니다. 배치처리의 에러가 발생 즉시 해결되지 않을 수도 있기 때문에 때문에 업무 규칙상으로 가능한 경우라면 부분적으로 성공한 건이라도 DB에 반영되는 것이 좋을 것입니다. 그렇지 않을 경우에 재시도시에 다시 모든 데이터를 처리해야 하니 그 처리시간이 더 길어지는 단점도 있습니다.
그렇다고 해서 데이터 매 건마다 따로 트랜잭션 처리를 하는 것도 성능상 좋지 못합니다. 트랜잭션을 시작하고 끝낼 때 드는 비용도 감안해야 되기 때문입니다.
따라서 일정한 행 단위를 묶어서 처리를 하는 것이 배치처리에서는 더 바람직한 방식이라고 할 수 있습니다.
WebSphere XD Compute Grid에서는 check-point algorithm을 time-based와 record-based 두 가지 방식으로 제공해서 이런 문제에 대한 해결책을 제시하고 있습니다.
Spring batch에서는 SimpleStepFactoryBean 클래스에서 commitInterval이라는 속성으로 주기적인 commit을 설정할 수 있습니다. 데이터 특성이나 업무규칙에 따라서 적절한 값을 트랜잭션 단위로 묶이는 건수를 지정할 수 있는 것입니다.
High-volume Transaction Processing in J2EE :
세번째 페이지의 Job Partitioning and Chunking 단락에서 아래와 같이 설명하고 있습니다.
Running your job as one long-lived transaction isn't a good idea. Long-lived transactions are more fragile than short-lived transactions. They are more susceptible to errors and DBMS locking problems because the locks are held longer. Smaller chunks are more reliable and less likely to exceed your connection and session timeouts.
Misconception: Big batch jobs should use a ‘dedicated’ rollback segment :
Oracle의 경우를 설명한 글입니다. DBA들이 보통 긴 transaction을 유지하는 batch job에 전용 role back segment를 할당하는데 실제로는 이것이 별도움이 못 된다고 말합니다. 결국 다른 session들이 사용할 수 있는 roll back segment를 사용하는 것은 똑같기 때문에 ORA-01555 에러를 유발할 수 있다고 합니다. 결국 보다 작은 transaction 단위를 가지고 가는 것이 근본적인 해결책입니다.
그리고 실패시 재시도를 위해서 지난 번 처리한 영역까지 표시하거나 앞에 성공한 건들을 다 지워줘야 하는 경우 때문에 큰 transaction을 가지고 가는 문제가 .생기는데, 재시도를 위한 기능을 트랜잭션에서 제공받기 전에 응용프로그램에서 적절한 로직으로 처리하는 것이 필요하다고 나와 있습니다.
The problem that needs to be addressed in cases such as these is the design of the batch processes that require such a huge transaction. Transactions in Oracle should normally be kept fairly short. While it is undesirable to commit for every row processed (which will cause excessive redolog buffer flushing and high waits on “log file sync”), it makes sense to have batch processes commit for every few hundred rows processed.
......
Often the greatest barrier to changing batch jobs to commit continuously is failure tolerance. If a batch job that commits continuously fails part way through, then there must be a way to restart that batch job where it left off, or clean up from the first attempt so that the job can be started over. Whereas before this restart capability was provided by rolling back the large transaction, the proposed rollback-friendly model requires that the appropriate application logic be built into the batch processing software.
......
If you allow your semi-frequently committing batch jobs to randomly select rollback segments like all the rest of the transactions in your system, you will be less likely to overwrite recently committed changes, since the burden of the batch transactions is spread around, rather than concentrated in a single rollback segment
Solving Business Problems with WebSphere Extended Deployment :
WebSphere XD에서 제공하고 있는 check-point algorithm에 대한 설명을 볼 수 있습니다.
Spring batch documentation - 4.4.1.2. Configuring a CommitInterval :
Spring batch에서 주기적인 commit을 설정하는 방법입니다.
# by | 2008/05/15 10:52 | 기술 자료 | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶