문제

주제:

나를 구현하기 위해 노력하고 기본적인 작업 예약에서 Java 를 손잡이 재발하는 지속 예약된 작업(개인 배우한)를 이용하실 수 있습니다내가 사용하고 싶지 않은 어떠(ready-to-use)라이브러리에는 다음과 같 석영/Obsidian/Cron4J/등이 있습니다.

목적:

  • 작업에 지속적인 것을(을 처리하는 서버 종료)
  • 작업 실행 시간이 걸릴 수 있습니다~2-5mn.
  • 관리 많은 양의 작업
  • 멀티스레드
  • 빛과 fast;)

내 모든 작업은 MySQL 데이터베이스에서.

JOB_TABLE (id, name, nextExecution,lastExecution, status(IDLE,PENDING,RUNNING))

단계별:

  1. 검색 각각의 작업에서"JOB_TABLE"가 “nextExecution > now” AND “status = IDLE“.이 단계 실행 모든 10mn 에 의해 하나의 스레드가 있습니다.

  2. 각 작업에 대한 검색되 나는 새로운드 스레드에서 ThreadPoolExecutor 그 후 업데이트 작업 상태"PENDING 에서"내"JOB_TABLE”.

  3. 작업 실행,업데이트 작업 상태"RUNNING”.

  4. 작업이 완료되면,업데이트 lastExecution 현재 시간으로,설정 새로운 nextExecution 시간과 저 작업 상태를 변경"IDLE”.

면 서버를 시작,내가 각각 넣어 보류 중인/실행 중인 작업에서 ThreadPoolExecutor.

질문/관찰

  • 2 단계:이 ThreadPoolExecutor 대량 처리의 스레드(~20000)?
  • 를 사용해야 하는 NoSQL 에 대신 솔루션 MySQL?
  • 그것은 최고의 솔루션을 처리한 사용할 경우?

이것은 초안,코드가 없다.나는 열기를 제안,코멘트 및 비판!

도움이 되었습니까?

해결책

나와 비슷한 작업에 실제 프로젝트,하지만.NET.여기에 내가 무엇을 할 수 있습을 기억에 관한 질문:

2 단계:이 ThreadPoolExecutor 대량 처리의 스레드(~20000)?

우리가 발견되었습니다.그물에 내장된 스레드 풀었던 최악의 접근 방식으로 프로젝트는 웹 응용 프로그램입니다.이유:웹 응용 프로그램에 의존하는 내장된 스레드 풀(정체되고,따라서 공유한 모든 용도 내에서 실행하는 프로세스)실행하는 각 요청에는 별도의 스레드를 유지하면서 효과적인 재활용의 스레드입니다.채용 같은 스레드 풀을 위해이 우리 내부에서 처리하려고 배기가 그것을 떠나지 않는 스레드에 대한 사용자의 요청,또는 망의 성능,는 용납되지 않았다.

으로 실행하는 것은 꽤 많은 작업(20k 많은 단계)다음 당신은 확실히 보여야에 대해 사용자 지정 스레드 수영장도 있습니다.를 작성할 필요가 없습니다 당신의 자신의 비록,내가 준비되어 솔루션과 쓰나는 지금까지의 연구 프로젝트에 필요한 것이* 주석을 참조하십시오 (내가 제대로 이해한다면 당신이 하고 있는 학교 또는 대학)를 이용하실 수 있습니다

를 사용해야 하는 NoSQL 에 대신 솔루션 MySQL?

따라 달라집니다.당신은 분명히 업데이트할 필요가 작업 상태에서 동시에,따라서,당신은 당신 동시 액세스를 하나의 테이블에서 여러 스레드입니다.데이터베이스를 확장 할 수 있습니다 꽤 잘하는 가정하면,당신은 당신의 것은 옳습니다.여기에 내가 참조 하이 오른쪽:

  • 디자인 코드 는 방법으로 각각의 작업에 영향을 미칠 것만 자신의 하위 집합의 행에는 데이터베이스(이 포함되어 있는 다른 테이블).할 수 있는 경우 그렇게 당신이 필요하지 않습니다 어떤 명시적인에 대한 잠금 데이터베이스 레벨(의 형태로 거래 serialization 레벨).할 수 있도 적용을 자유 직렬화 수준의 수 있는 더러운 또는 팬텀을 읽는 더 빠르게 수행됩니다.지 조심, 해야 합니다 신이 없도록 작업에서 동의 동의 행이 있습니다.이것은 하드에서 달성하기 위해 실제 프로젝트,그래서 당신은 아마도 모를 위한 대체 접근 방식에서 db 있습니다.

  • 사용 해당 트랜잭션 직렬화 모드입니다. 트랜잭션 직렬화 모드를 정의 잠금 행동에 데이터베이스의 수준이다.당신은 그것을 설정할 수 있습니다 잠금 전체를 테이블,행만 당신에 영향을 미치거나 전혀 없습니다.그것을 사용하기 때문에,현명하게 오용에 영향을 미칠 수 있는 데이터는 일관성,무결성 및 안정성의 전체 응용 프로그램 또는 db 서버입니다.

  • 나는 익숙하지 않 NoSQL 에 데이터베이스,그래서 내가 할 수 있는 유일한 조언을 연구에서 동시성 기능을 지니다.구조가 발생할 수 있습은 정말 적합한 솔루션이지만,를 확인해야 합니다.귀하의 설명에서,당신은 당신을 지원하는 데이터를 동시 작업을 동일한 유형의 객체(은 무엇 아날로그에 대한 테이블).

그것은 최고의 솔루션을 처리한 사용할 경우?

예 아니다.

  • , 으로 발생하는 것 중 하나 어려운 업무 개발에서 직면하고있다.일 동료들과는 3 회 이상 내 자신의 경험들이 더 수행하기를 꺼려 멀티-스레딩 작업을 나보다,그들이 정말 싫어했다.당신이 느끼는 경우 이 지역은 흥미로운 당신,그것으로 재생,배우고 개선할 수 있습니다.

  • No, 기 때문에 작업하는 경우에는 실제 프로젝트를 당신이 뭔가를 필요로 신뢰할 수 있습니다.이 있는 경우 그렇게 많은 질문,당신은 분명히 필요로 성숙하는 시간을 생산할 수 있는 안정적인 솔루션을 위한 이러한 작업입니다.멀티 스레딩하는 것은 어려운 주제에 대한 많은 이유:

    • 그것은 하드 디버깅
    • 그것을 소개하고 많은 포인트의 실패,당신이 알고 있어야 그들 모두의
    • 그것은 될 수 있는 고통에 대한 다른 개발자들을 돕기 위해 또는 작동 코드와 함께하지 않는 한,당신은 잘 접착을 일반적으로 수용되는 규칙이 있습니다.
    • 오류 처리할 수 있는 것은 까다로운
    • 한 동작을 예측할 수 없/undeterministic.

    거기에 기존 솔루션과 높은 수준의 성숙하고 신뢰성 있는 선호하는 방법에 대한 실제 프로젝트입니다.단점은 당신이 그들을 배우 검사자들은 귀하의 필요합니다.

어쨌든,수행해야 하는 경우에는 그것의 방법,그리고 포트에 당신의 성과를 실제 프로젝트 또는 프로젝트의 자신,내가 조언을 할 수 있 당신이 이렇게하려면에서 플러그 가능한 방법입니다.사용상 프로그래밍 인터페이스 그리고 다른 방법을 분리할 것이 자신의 특정한 구현에서는 논리로 설정합니다 예약된 작업입니다.는 방법에 적응할 수 있습니다 당신의 api 를 기존 솔루션은 경우 이 문제가 된다.


그리고 마지막으로, 하지만 적어도, 하지 않았다,오류 메시지가 표시 처리 예측 당시의 쪽에 있습니다.생각하고 연구에서는 무엇을 할 작업이 실패하는 경우.적어도가'하지 못했습니다.'상태를 유지에서 그러한 경우입니다.오류 처리하는 것은 까다로운 때를 스레드,그래서 철저한 연구를 사용하고 있습니다.

행운

다른 팁

선언할 수 있는 최대 수영장 크기와 ThreadPoolExecutor#setMaximumPoolSize(int).로 Integer.MAX 크 20000 다음으로 기술적으로 그렇습니다 그것은 할 수 있다.

다른 질문은행하는 기계 고원 지원을 이렇게 많은 스레드를 실행합니다.당신이 충분히 제공 RAM 그래서 각각의 트레드에 할당할 것이다.

네게 해야 되지 않는 문제 주~20,000 스레드 에 현대적인 데스크탑이나 노트북에 있지만 모바일 장치에서 문제가 될 수 있습니다.

에서 doc:

핵심은 최대 수영장 크기

A ThreadPoolExecutor 것이 자동으로 조절 수영장 크기(getPoolSize())에 따라 범위 설정 여 corePoolSize(참조하십시오 getCorePoolSize())과 maximumPoolSize(참조하십시오 getMaximumPoolSize()).새로운 작업 제출 방법 execute(java.랭.Runnable),그보다 적은 corePoolSize 스레드 실행,새로운 스레드가 만든 요청을 처리하는 경우에도,기타 worker 쓰레드가 유휴 상태입니다.보다 많은 경우 corePoolSize 미만 보다 maximumPoolSize 스레드를 실행하는 새로운 스레드 생성됩 는 경우에만 큐가 가득 찼습니다.을 설정하여 corePoolSize 및 maximumPoolSize 일을 만들고 수정 크기의 스레드 수영장도 있습니다.에 의해 설정 maximumPoolSize 는 기본적으로 결합하지 않은 값을 등 정수입니다.MAX_VALUE,당신은 허용할 수영장을 수용할 수 있는 임의 숫자의 동시 작업입니다.가장 일반적으로,코어 최대 수영장 크기가 설정에 따라 건설,그러나 그들은 변경하실 수 있습니다 를 사용하여 동적으로 setCorePoolSize(int)및 setMaximumPoolSize(int).

More

에 대한 DB.는 솔루션을 만들은 의존하지 않을 DB 구조입니다.다음 설정할 수 있습니다 두 개의 enviorements 고 그것을 측정합니다.시작과 기술을 알고있다.하지만 계속 오픈하는 다른 솔루션입니다.에서 시작한 관계 DB 을 유지해야 performance.는 경우 당신은 옴 그것이 제대로 이해야 하는 문제가 되지 않습니다.는 NoSQL 작업을 수행하는 데 사용되는 정말 큰 데이터입니다.하지만 당신을 위해 최선을 모두 만들고 실행하 어떤 성능 테스트합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top