1

스트림 처리 인프라를 처음으로 구현하는 경우 독이 storm 1.0.1, kafka 0.9.0 및 Clojure 1.5입니다.Apache Kafka 및 Strom Clojure 구현

이제 메시징 시스템 (RabbitMQ)에 대한 배경 지식이 있고 몇 가지 이유로 좋아했습니다. 나는 소비자를 시작하고 메시지가 소비되지 않은 알고있는 경우

  • 영구 메시지 상태는 유지됩니다
  • 니스 프론트 엔드 웹 포털을 설치 및 유지 관리

    1. 간단한. 즉 "정확히 한 번"

    그러나 원하는 처리량을 얻을 수 없습니다.

    지금은 크게 수동으로 오프셋 (offset)을 유지 (외부에서 내부 카프카 브로커에 Zookeper 이상)에 따라 카프카를 통과 한

    나는 긴 마지막 카프카 브로커 인 소스와 Clojure의에 주둥이를 만들기 위해 관리

    하는 악몽이었다.

    지금 documentation 상태

    기본적으로 제공하고 있습니다 그래서 효과적으로 카프카 보장 한 번에-최소 사용자가 가장에 구현하는 나는 "정확히 한 번 메시징"입니다 욕망 대부분의 시나리오와 카프카에 따라 좋아 한 번의 배달은 생산자에 대한 재시도를 비활성화하고 메시지 묶음을 처리하기 전에 오프셋을 커밋합니다. 정확히 한번 배송하려면 대상 스토리지 시스템과의 협력이 필요하지만 Kafka는 이것을 실현하는 오프셋을 제공합니다.

    clojure kafka 스파우트의 개념으로는 개념화하기가 어렵습니다.

    나는 도중에 여러개의 boltz를 가지고 있을지도 모릅니다 만 끝점은 Postgres 클러스터입니다. 나는 데이터베이스에 오프셋을 저장하고 (레이스 위험이 발생하기를 기다리는 것처럼 들린다), 폭풍우 클러스터를 초기화 할 때 Postgres에서 오프셋을 가져 옵니까?

    또한 카프카 스파우트에 대한 병렬 처리를 하나 이상의 숫자로 설정할 위험이 있습니까?

    일반적으로 this을 시작점으로 사용합니다. 많은 예가 Clojure에서 사용할 수 없습니다. 사용하고있는 버전에 대한 몇 가지 사소한 개조가 있습니다. 이 수행 할 수있는 작업의 일부가 정확히에 근무 될 수 있도록하는 것은 불가능 분산 된 시스템을

    (def ^{:private true 
        :doc "kafka spout config definition"} 
        spout-config (let [cfg (SpoutConfig. (ZkHosts. "127.0.0.1:2181") "test" "/broker" (.toString (UUID/randomUUID)))] 
          ;;(set! (. cfg scheme) (StringScheme.)) depricated 
          (set! (. cfg scheme) (SchemeAsMultiScheme. (StringScheme.)))     
          ;;(.forceStartOffsetTime cfg -2) 
          cfg)) 
    
    
    
    (defn mk-topology [] 
    (topology 
        {;;"1" (spout-spec sentence-spout) 
        "1" (spout-spec my-kafka-spout :p 1) 
        "2" (spout-spec (sentence-spout-parameterized 
           ["the cat jumped over the door" 
            "greetings from a faraway land"]) 
           :p 2)} 
        {"3" (bolt-spec {"1" :shuffle} 
           split-sentence 
           :p 5) 
        "4" (bolt-spec {"3" ["word"]} 
           word-count 
           :p 1)})) 
    
  • 답변

    1

    을 (내가 그들을 예상대로 내 메시지는 매우 나오지 않지만 적어도 나는 그들을 볼 수 있습니다) 일단. 어느 시점에서는 무언가가 실패 할 것이고 재 시도 ("적어도 한 번"처리라고 함) 또는 재 시도하지 않아야합니다 (이 작업은 "한 번만 처리"라고합니다). 정확히 그 중간을 가질 수는 없지만 "정확히 한 번"처리. 당신이 얻을 수있는 것은 정확하게 한 번만 가공하는 것에 가깝습니다.

    트릭은 프로세스가 끝날 때 으로, 두 번째 작업이 두 번 수행되면 두 번째 복사본을 버립니다. 이것은 인덱스가 들어오는 위치입니다. 결과를 데이터베이스에 저장할 때이 인덱스의 인덱스보다 더 오래된 인덱스가 이미 저장되어 있는지 확인하십시오.나중에 작업하는 것이 발견되면 작업을 버리고 저장하지 마십시오. 문서는 여러 번 해본 사람들에게 단지 "해협 전진"인 설명의 종류입니다 ...

    +0

    이것은 통찰력있는 이야기입니다. –

    관련 문제