2017-11-05 2 views
0

나는이 질문을하기 전에 여기에서 물었다는 것을 알고있다 : Kafka Streaming Concurrency?카프카 스트림 프로세서 스레드는 안전합니까?

그러나 이것은 나에게 매우 이상하다. 문서 (또는 어쩌면 내가 뭔가 놓치고있다)에 따르면 각 파티션은 프로세서의 다른 인스턴스를 의미하는 작업을 가지고 있으며 각 작업은 다른 스레드에 의해 실행 중이다. 하지만 테스트했을 때, 다른 스레드가 프로세서의 다른 인스턴스를 얻을 수 있다는 것을 알았습니다. 따라서 프로세서의 메모리 상태 (예전 방식)를 유지하려면 잠 가야합니까?

예 번호 :

public class SomeProcessor extends AbstractProcessor<String, JsonObject> { 

    private final String ID = UUID.randomUUID().toString(); 

    @Override 
    public void process(String key, JsonObject value) { 
    System.out.println("Thread id: " + Thread.currentThread().getId() +" ID: " + ID); 

OUTPUT :

스레드 ID : 88 ID : 26b11094-a094-404b-b610-88b38cc9d1ef

스레드 ID : 88 ID : c667e669 -9023-494b-9345-236777e9dfda

스레드 ID : 88 ID : c667e669-9023-494b-934 5-236777e9dfda

스레드 ID : 90 ID : 0a43ecb0-26f2-440d-88e2-87e0c9cc4927

스레드 ID : 90 ID : c667e669-9023-494b-9345-236777e9dfda

스레드 ID : ID 90 : c667e669-9023-494b-9345-236777e9dfda

인스턴스마다 스레드를 적용 할 수있는 방법이 있습니까?

답변

1

인스턴스 당 스레드 수는 num.stream.threads이고 기본값은 1입니다. 따라서 단일 KafkaStreams 인스턴스를 시작하면 num.stream.threads 개의 스레드가 생성됩니다.

작업은 입력 항목 파티션을 기반으로 병렬 작업 단위로 작업을 분할하고 스레드에 할당됩니다. 따라서 여러 작업과 단일 스레드가있는 경우 모든 작업이이 스레드에 할당됩니다. 스레드가 두 개있는 경우 (모두 KafkaStreams 인스턴스를 합친) 각 스레드는 약 50 %의 작업을 실행합니다.

주 : 카프카 스트림 응용 프로그램이 자연에서 분산되어 있기 때문에 여러 스레드, 또는 여러 개의 단일 KafkaStreams 예를 KafkaStreams 하나 개의 스레드 각각 인스턴스화를 실행하는 경우, 아무런 차이가 없다. 작업은 응용 프로그램의 사용 가능한 모든 스레드에 분산됩니다.

작업간에 데이터 구조를 공유하고 더 많은 스레드가있는 경우이 데이터 구조에 대한 액세스를 동기화하는 것은 사용자의 책임입니다. 태스크 간 스레드 할당은 런타임 중에 변경 될 수 있으므로 모든 액세스는 동기화되어야합니다. 그러나이 패턴은 확장 성을 제한하므로 권장하지 않습니다. 공유 데이터 구조없이 프로그램을 설계해야합니다!이 주된 이유는 프로그램이 일반적으로 여러 컴퓨터에 분산되어 있으므로 서로 다른 KafkaStreams 인스턴스가 공유 데이터 구조에 액세스 할 수 없다는 것입니다. 데이터 구조를 공유하는 것은 단일 JVM에서만 작동하지만 단일 JVM을 사용하면 응용 프로그램에서 수평 확장을 방지 할 수 있습니다.

+0

@ matthias-j-sax에 대한 답장을 보내 주셔서 감사합니다.사실 그 옵션을 알고있었습니다. 문제는 내가 스트림을 "스레드 안전하지 않음"으로 쓰지 않고 나쁜 실례이기 때문에 하나의 스레드를 사용하도록 강요한다는 것입니다. 나는 Kafka 스트림이 AKKA 배우 패턴과 유사한 API/문장 부호 API에서 "스레드 안전성"을 지원한다고 가정했습니다. 그러나 나는 틀렸다고 생각한다. 어쨌든 이제는 구식 잠금을 사용하는 것 외에는 아무것도 없다는 것을 이해합니다. 다시 한 번 감사드립니다. –

관련 문제