2017-10-11 1 views
1

Google Cloud Platform을 처음 사용했습니다. AppEngine 표준 환경을 사용하고 있습니다. 자바에서 스레드을 작성해야하지만 가능하지 않다고 생각합니까?AppEngine 표준 환경에서 java로 스레드 생성하기

내가 사용자를위한 피드 작성해야합니다 : 여기

상황이다.

이름이 d1, d2, d3 인 세 개의 데이터베이스가 있습니다.

사용자가 피드 요청을 보낼 때마다 Java는 각 데이터베이스 당 하나씩 3 개의 스레드를 생성합니다. 예 : d1의 경우 t1, d2의 경우 t2, d3의 경우 t3. 이러한 스레드는 더 나은 성능을 위해 비동기 적으로 실행해야하며 그 후에이 3 개의 스레드의 데이터가 결합되어 사용자에게 응답으로 전송됩니다.

이 코드를 작성하는 방법을 알고 있지만이 작업을 위해 스레드가 필요하다는 것을 알고 있습니다. AppEngine 표준 Env. 그것을 허용하지 않습니다 그럼 내가 뭘 할 수 있습니까? 다른 방법이 있습니까? GCP 문서에서

는 말했다 :

이 스레드를 사용하지 않는 내가 작업 대기열에 대해 읽어 작업 대기열

을 고려하십시오. 대기열에는 Push와 Pull의 두 가지 유형이 있습니다. 둘 다 비동기 적으로 실행되지만 사용자에게 응답을 보내지 않습니다. 나는 그들이 단지 백그라운드에서 작업을 완료하도록 설계된 것 같아요.

내 목표를 어떻게 달성 할 수 있는지 알려주십시오. 내가 이것을 배우기 위해 필요한 것은 무엇입니까?

답변

1

참고 : 답변은 전적으로 문서를 기반으로합니다. 저는 자바 사용자가 아닙니다.

스레드는 표준 환경에서 지원되지만 제한 사항이 있습니다. Threads에서 :

주의 : 스레드는 놀라움으로 가득 강력한 기능입니다. Java에서 스레드를 사용하는 방법에 대해 자세히 알아 보려면 Goetz, Java Concurrency in Practice을 권장합니다.

Java 응용 프로그램이 새 스레드를 만들 수 있지만 수행 방법에 대한 제한 사항은 입니다. 이 스레드는 메시지를 생성하는 요청보다 "오래 지속되지"못합니다.

응용 프로그램은

  • java.lang.Runnable을 구현할 수 있습니다.
  • com.google.appengine.api.ThreadManager.currentRequestThreadFactory()을 호출하여 스레드 팩토리를 생성하십시오.
  • Runnable, newRequestThread(runnable) 전달 전화 공장의 newRequestThread 방법, 또는는 ExecutorService (예를 들어, 전화 Executors.newCachedThreadPool(factory))와 com.google.appengine.api.ThreadManager.currentRequestThreadFactory() 에 의해 반환 된 팩토리 객체 를 사용합니다.

그러나 ThreadManager에있는 방법 중 하나를 사용하여 스레드를 만들어야합니다. new Thread()을 직접 호출하거나 default thread factory을 사용할 수 없습니다.

응용 프로그램이 과 같은 현재 스레드에 대해 작업을 수행 할 수 있습니다. thread.interrupt().

각 요청은 50 개의 동시 요청 스레드로 제한됩니다. 한 요청에서 50 개 이상의 스레드를 만들려고하면 Java 런타임에서 java.lang.IllegalStateException이 발생합니다.

스레드를 사용할 때는 ExecutorRunnable과 같이 high level concurrency objects을 사용하십시오. 그러한 것들은 미묘한 것 중 많은 부분을 다루지 만, Interruptsscheduling and bookkeeping과 같은 동시성의 중요한 세부 사항은 입니다.

+0

Cloud SQL에서 데이터를 가져올 때 mutliThread 성능이 향상된다는 것을 한 가지 더 묻고 싶습니다. 나는 java에서 mutliThread 성능에 ​​대한 많은 질문을 읽었지만 여기서는 상황이 바뀌 었다고 생각한다. 다른 mechine에있는 cloud sql의 데이터를 얻고있다. –

+0

Cloud SQL은 3 개의 데이터베이스에 3 개의 요청을 동시에 처리 할 수 ​​있다고 상상한다. 사용자 요청 *은 스레드 된 병렬 데이터베이스 작업에서보다 빠른 응답 시간을 가져야합니다. –

0

우아한 방법은 반환 당신이 URLFetchService에서 fetchAsync 호출을 수행 할 수있는 응용 프로그램

/runFeed?db=d1 

에 그리고 당신의 "주"응용 프로그램 코드에서 parametrable 엔드 포인트를 작성하는 것입니다 필요 구현 너 java.util.concurrent.Future<HTTPResponse>

이렇게하면 응용 프로그램이하는 일을 더 잘 모니터링 할 수 있습니다. urlFetchService가 무료가 아니므로 응용 프로그램에 네트워크 대기 시간이 추가되고 비용이 증가합니다.

관련 문제