web-dev-qa-db-ja.com

Kafka Spring Bootを使用したスト​​リーム

Kafka SpringsリアルタイムプロジェクトでのStreamsリアルタイム処理を使用したいので、Kafka Streams構成が必要です。または、KStreamsまたはKTableを使用したいと思います。 、しかし私はインターネットで例を見つけることができませんでした。

リアルタイムでストリーミングしたいので、プロデューサーとコンシューマーを作成しました。

11
Alpcan Yıldız

Kafkaストリームに慣れていない場合、その上にspring-bootを追加すると、さらに複雑なレベルが追加されます。そしてKafkaストリーム大きな学習曲線がそのままあります。次の基本的な方法があります:pom:

 <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
    <dependency>
      <groupId>org.springframework.kafka</groupId>
      <artifactId>spring-kafka</artifactId>
      <version>2.1.10.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.Apache.kafka/kafka-clients -->
    <dependency>
      <groupId>org.Apache.kafka</groupId>
      <artifactId>kafka-clients</artifactId>
      <version>${kafka.version}</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.Apache.kafka/kafka -->
    <dependency>
      <groupId>org.Apache.kafka</groupId>
      <artifactId>kafka_2.12</artifactId>
      <version>${kafka.version}</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.Apache.kafka/kafka-streams -->
    <dependency>
      <groupId>org.Apache.kafka</groupId>
      <artifactId>kafka-streams</artifactId>
      <version>${kafka.version}</version>
    </dependency>


    <!--&lt;!&ndash; https://mvnrepository.com/artifact/org.Apache.kafka/kafka-streams &ndash;&gt;-->
    <dependency>
      <groupId>org.Apache.kafka</groupId>
      <artifactId>connect-api</artifactId>
      <version>${kafka.version}</version>
    </dependency>

次に設定オブジェクトです。以下のコードは、2つのストリームアプリを作成していることを前提としています。各アプリは独自の処理トポロジを表すことに注意してください。

import org.Apache.kafka.clients.consumer.ConsumerConfig;
import org.Apache.kafka.common.serialization.Serdes;
import org.Apache.kafka.streams.StreamsConfig;
import org.Apache.kafka.streams.processor.FailOnInvalidTimestamp;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.KafkaStreamsDefaultConfiguration;
import org.springframework.kafka.core.StreamsBuilderFactoryBean;

import Java.util.HashMap;
import Java.util.Map;

@Configuration
public class KafkaStreamConfig {

  @Value("${delivery-stats.stream.threads:1}")
  private int threads;

  @Value("${delivery-stats.kafka.replication-factor:1}")
  private int replicationFactor;

  @Value("${messaging.kafka-dp.brokers.url:localhost:9092}")
  private String brokersUrl;


  @Bean(name = KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME)
  public StreamsConfig kStreamsConfigs() {
    Map<String, Object> config = new HashMap<>();
    config.put(StreamsConfig.APPLICATION_ID_CONFIG, "default");
    setDefaults(config);
    return new StreamsConfig(config);
  }


  public void setDefaults(Map<String, Object> config) {
    config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, brokersUrl);
    config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
    config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
    config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
    config.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, FailOnInvalidTimestamp.class);
  }

  @Bean("app1StreamBuilder")
  public StreamsBuilderFactoryBean app1StreamBuilderFactoryBean() {
    Map<String, Object> config = new HashMap<>();
    setDefaults(config);
    config.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE);
    config.put(StreamsConfig.APPLICATION_ID_CONFIG, "app1");
    config.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 30000);
    config.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, threads);
    config.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, replicationFactor);
    return new StreamsBuilderFactoryBean(config);

  }

  //
  @Bean("app2StreamBuilder")
  public StreamsBuilderFactoryBean app2StreamBuilderFactoryBean() {
    Map<String, Object> config = new HashMap<>();
    setDefaults(config);
    config.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, StreamsConfig.EXACTLY_ONCE);
    config.put(StreamsConfig.APPLICATION_ID_CONFIG, "app2");
    config.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 30000);
    config.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, threads);
    config.put(StreamsConfig.REPLICATION_FACTOR_CONFIG, replicationFactor);
    return new StreamsBuilderFactoryBean(config);
  }
}

次に、streamsBuilderを使用してアプリ(この例ではapp1)を作成して、楽しい部分が始まります。

import lombok.extern.slf4j.Slf4j;
import org.Apache.kafka.common.serialization.Serdes;
import org.Apache.kafka.streams.KeyValue;
import org.Apache.kafka.streams.StreamsBuilder;
import org.Apache.kafka.streams.kstream.Consumed;
import org.Apache.kafka.streams.kstream.KStream;
import org.Apache.kafka.streams.kstream.Produced;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class App1 {
  @SuppressWarnings("unchecked")
  @Bean("app1StreamTopology")
  public KStream<String, Long> startProcessing(@Qualifier("app1StreamBuilder") StreamsBuilder builder) {

    final KStream<String, Long> toSquare = builder.stream("toSquare", Consumed.with(Serdes.String(), Serdes.Long()));
    toSquare.map((key, value) -> { // do something with each msg, square the values in our case
      return KeyValue.pair(key, value * value);
    }).to("squared", Produced.with(Serdes.String(), Serdes.Long())); // send downstream to another topic

    return toSquare;
  }

}

お役に立てれば。

6
dmonkey

Spring BootでのStreamsアプリケーションを初期化する別の方法Kafkaは、次の場所にあります。

https://Gist.github.com/itzg/e3ebfd7aec220bf0522e23a65b1296c8

このアプローチでは、kafkaStreams.start()を呼び出すKafkaStreams Beanを使用します。これは、トポロジBeanまたはStreamBuilder Beanのいずれかを使用できます。

1
Jakub Svoboda

Kafka Spring Bootでのストリーム:

  1. https://start.spring.io を使用してプロジェクトをブートストラップします。 Cloud StreamおよびSpring for Apache Kafka Streamsas dependency。これは、事前設定されたプロジェクトテンプレートへのリンクです: https://start.spring.io/#!language=Java&dependencies=kafka-streams,cloud-stream

  2. アプリでKStream Beanを定義します。例として、これは非常に基本的なコンシューマアプリケーションです。データを消費し、KStreamから標準出力にレコードを記録するだけです。

    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Main.class, args);
        }
    
        @Bean
        public Java.util.function.Consumer<KStream<String, String>> process() {
            return stream -> stream.foreach((key, value) -> {
                System.out.println(key + ":" + value);
            });
        }
    }
    

    このアプリケーションでは、単一の入力バインディングを定義しました。 Springはこのバインディングをprocess-in-0という名前で作成します。つまり、Bean関数の名前の後に-in-が続き、その後にパラメーターの序数の位置が続きます。このバインディング名を使用して、トピック名などの他のプロパティを設定します。たとえば、spring.cloud.stream.bindings.process-in-0.destination=my-topicなどです。

    その他の例を見る こちら -Spring Cloud Stream Kafkaバインダーリファレンス、プログラミングモデルセクション。

  3. 次のようにapplication.yamlを構成します。

    spring:
      cloud:
        stream:
          bindings:
            process-in-0.destination: my-topic
          kafka:
            streams:
              binder:
                applicationId: my-app
                brokers: localhost:9092
                configuration:
                  default:
                    key:
                      serde: org.Apache.kafka.common.serialization.Serdes$StringSerde
                    value:
                      serde: org.Apache.kafka.common.serialization.Serdes$StringSerde
    
0
andrii

それは実際には特定の質問ではありません。 SpringとKafka Frameworkを使用してストリーム処理を実行する場合は、 spring-kafka を確認することをお勧めします。そこに多数の例があります。ここにあります- それらの1つ 。このアプリケーションをより大きなパイプラインの一部にしたい場合は、Kafka Native APIまたはSpring-Kafkaを使用してソリューションを提供できます。たとえば、Spring Cloud DataFlowの場合、Spring-Kafkaを使用することをお勧めします。それ以外の場合は、ネイティブKafka APIのみを使用します。

0
dbustosp

https://start.spring.io/ を使用して、新しいSpring Bootプロジェクトを最初から作成し、それに応じて必要なバージョン/依存関係を選択して、プロジェクトを生成/ダウンロードできます。

kstream APIメソッドの実装を開始できます( https://kafka.Apache.org/10/javadoc/org/Apache/kafka/streams/kstream/KStream.html

0
Santosh