配布トピック★大きな工場に入るにはカフカを知っておく必要があります

配布トピック★大きな工場に入るにはカフカを知っておく必要があります

前書き

カフカとは何ですか?

KafkaはもともとLinkedinによって開発されました。これは、分散型、パーティション対応、マルチレプリカ(レプリカ)、およびzookeeperによって調整された分散型メッセージングシステムです。最大の特徴は、大量のデータをリアルタイムで処理できることです。さまざまな需要シナリオ:たとえば、Hadoopに基づくバッチ処理システム、低遅延のリアルタイムシステム、Storm / Sparkストリーミングエンジン、Web / nginxログ、アクセスログ、メッセージサービスなど、2010年にLinkedinによって提供されたスカラ言語で記述されています。 Apache Foundationに参加し、トップのオープンソースプロジェクトになります

kafkaはどこで使用できますか?

  • ログ収集:企業はKafkaを使用してさまざまなサービスのログを収集し、Kafkaを介した統合インターフェースサービスでhadoop、Hbase、Solrなどのさまざまなコンシューマーに公開できます。

  • メッセージシステム:デカップリングとプロデューサーとコンシューマー、メッセージのキャッシュなど。

  • ユーザーアクティビティの追跡:Kafkaは、Webの閲覧、検索、クリックなどのWebユーザーまたはアプリユーザーのさまざまなアクティビティを記録するためによく使用されます。これらのアクティビティ情報は、さまざまなサーバーによってKafkaトピックに公開され、サブスクライバーはこれらをサブスクライブします。トピックリアルタイムの監視と分析を行うか、オフラインの分析とマイニングのためにそれをhadoopまたはデータウェアハウスにロードします。

  • 運用指標:Kafkaは、運用監視データの記録にもよく使用されます。これには、さまざまな分散アプリケーションからのデータの収集や、アラームやレポートなどのさまざまな操作に対する一元化されたフィードバックの生成が含まれます。

カフカの基本コンポーネント

  • ブローカ

    メッセージミドルウェア処理ノード、Kafkaノードはブローカーであり、1つ以上のブローカーがKafkaクラスターを形成できます

  • トピック

    Kafkaはトピックに従ってメッセージを分類し、Kafkaクラスターに公開される各メッセージはトピックを指定する必要があります

  • プロデューサー

    メッセージプロデューサー、ブローカーにメッセージを送信するクライアント

  • 消費者

    メッセージコンシューマー、ブローカーからのメッセージを読み取るクライアント

  • ConsumerGroup

    各コンシューマーは特定のコンシューマーグループに属しています。メッセージは複数の異なるコンシューマーグループによって消費されますが、コンシューマーグループ内の1つのコンシューマーのみがメッセージを消費できます。

  • パーティション

    物理的には、トピックを複数のパーティションに分割できます。各パーティションの内部メッセージは順序付けられ、各パーティションは複数のコピーの割り当てをサポートできます。複数のコピーが配置されているブローカーの中から、リーダーが選出されます。リーダーパーティションは読み取りおよび書き込み要求の処理を担当し、他のフォロワーに格納されているコピーにデータを同期します。

カフカがわかりにくい

  • メッセージは消費後に削除されません

    メッセージが消費された後も、パーティションに保存されますが、いつ削除されますか?構成パラメーターlog.retention.hoursによって決定されます。10に設定されている場合、メッセージは10時間後に削除されます。

  • トピック、パーティション、およびブローカー間の関係

    トピックはビジネスデータセットを表します。たとえば、注文データを処理する必要がある場合、注文メッセージのトピックを作成すると、すべての注文メッセージがこのトピックに送信されます。

    注文メッセージが増えると、このトピックはどんどん大きくなり、TBに達する可能性があります。単一のマシンに保存しないでください。このトピックを分割できます。これらのパーティションは分散します。異なるマシンでは、分割します。複数のパーティションは、メッセージの同時消費を改善することにもなります。前述のように、パーティションは各コンシューマーグループの1人のコンシューマーのみが消費できます。複数のパーティションに分割されている場合、複数のコンシューマーが同時に消費できます。 ;

    ブローカーは最も理解しやすいものです。kafkaプロセスを実行しているマシンはブローカーです。

  • Kafkaは、従来のメッセージングの2つのモードであるキューとサブスクリプションをどのようにサポートしていますか

    • キューモード:すべてのコンシューマーが同じコンシューマーグループに属し、メッセージが1人のコンシューマーによってのみ消費されるようにします

    • パブリッシュ/サブスクライブモデル:各コンシューマーが同じメッセージを受信できるように、コンシューマーを異なるコンシューマーグループに配置します

    これらの2つのモードは、Kafkaの消費メカニズムに基づいています。プロデューサーによって送信されたメッセージは、トピックにサブスクライブされたすべてのコンシューマーグループ(コンシューマーグループ)に送信されますが、各コンシューマーグループの1つのコンシューマーのみがこのメッセージを消費できます。
    ここに画像の説明を挿入

  • Kafkaはどのようにしてメッセージの順次消費を保証しますか

    Kafkaは、パーティション内のメッセージがコンシューマーグループ内の1人のコンシューマーのみが消費できることを保証しているため、プロデューサーはメッセージを同じパーティションに送信して、メッセージが順次消費されるようにする必要があります。

Dockerにkafkaをインストールする方法

kafkaをインストールする前提は、zookeeperをインストールする必要があるということです。

  • Zookeeperをインストールする
# 创建文件夹
mkdir -p ~/docker/zookeeper/conf
mkdir -p ~/docker/zookeeper/data
mkdir -p ~/docker/zookeeper/datalog
docker run -d --name zookeeper \
--restart always \                        # docker服务启动时, 默认启动zookeeper容器
-p 2181:2181 -p 2888:2888 -p 3888:3888 \
-v ~/docker/zookeeper/conf:/conf \
-v ~/docker/zookeeper/data:/data \
-v ~/docker/zookeeper/datalog:/datalog \
zookeeper:3.4.14
  • 安装kafka
 docker run  -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -v ~/docker/kafka/logs:/kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper --link zookeeper:zookeeper -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${IP}:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
  • テストにはkafkaの組み込みコンソールプロデューサーとコンシューマーを使用します

# 开启生产者
docker exec -it kafka bash
# 创建主题
kafka-topics.sh --create -zookeeper zookeeper --topic lezai --partitions 3 -replication-factor 1
# 生产者连接kafka
kafka-console-producer.sh --topic lezai -bootstrap-server 127.0.0.1:9092

# 开启消费者
docker exec -it kafka bash
# 消费者连接kafka
kafka-console-consumer.sh --topic lezai -bootstrap-server 127.0.0.1:9092 --from-beginning

# 现在在生产者窗口输入内容,看看消费者窗口是否能收到
  • Kafkaコマンドラインの一般的な操作
1.查看topic的详细信息 
./kafka-topics.sh -bootstrap-server 127.0.0.1:2181 -describe -topic testKJ1 
  
2、为topic增加副本 
./kafka-reassign-partitions.sh -zookeeper 127.0.0.1:2181 -reassignment-json-file json/partitions-to-move.json -execute 
  
3、创建topic 
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testKJ1 
  
4、为topic增加partition 
./bin/kafka-topics.sh –zookeeper 127.0.0.1:2181 –alter –partitions 20 –topic testKJ1 
  
5、kafka生产者客户端命令 
./kafka-console-producer.sh --broker-list localhost:9092 --topic testKJ1 
  
6、kafka消费者客户端命令 
./kafka-console-consumer.sh -zookeeper localhost:2181 --from-beginning --topic testKJ1 
  
7、kafka服务启动 
./kafka-server-start.sh -daemon ../config/server.properties  
  
8、下线broker 
./kafka-run-class.sh kafka.admin.ShutdownBroker --zookeeper 127.0.0.1:2181 --broker #brokerId# --num.retries 3 --retry.interval.ms 60 
shutdown broker 
  
9、删除topic 
./kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic testKJ1 --zookeeper 127.0.0.1:2181 
./kafka-topics.sh --zookeeper localhost:2181 --delete --topic testKJ1 
  
10、查看consumer组内消费的offset 
./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper localhost:2181 --group test --topic testKJ1

スプリングブーツ統合カフカ

  • 依存インポート
 <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
 </dependency>
  • 構成ファイル
server:
  port: 8080
spring:
  kafka:
    bootstrap-servers: 127.0.0.1:9092
    producer: # 生产者
      retries: 3 # 设置大于0的值,则客户端会将发送失败的记录重新发送
      batch-size: 16384
      buffer-memory: 33554432
      # 指定消息key和消息体的编解码方式
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: mygroup
      enable-auto-commit: true
  • メッセージプロデューサーを追加する
    @Autowired
    private KafkaTemplate<String,String> kafkaTemplate;
    @Test
    public  void send(){
        kafkaTemplate.send("lezai",0,"key","kafkasss 发送数据");
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  • 2つの消費者を追加します。異なる消費者グループがあります
    @KafkaListener(topics = "lezai",groupId = "testGroup")
    public void listen(ConsumerRecord<String, String> record) {
        String value = record.value();
        System.out.println("testGroup"+value);
        System.out.println(record);
    }


    @KafkaListener(topics = "lezai",groupId = "testGroup2")
    public void listen2(ConsumerRecord<String, String> record) {
        String value = record.value();
        System.out.println("testGroup2"+value);
        System.out.println(record);
    }
    
    // 可以切换为相同的groupId,来验证消息是否会被同一个消费组中的消费者消费

Wechatで検索を検索[LeZaiオープントーク]ハンサムな私をフォローし、[乾物を受け取る]と返信すると、Javaの基本、Javaの同時実行など、選択を待っているインタビュー資料や建築家の必読の本がたくさんあります。マイクロサービス、ミドルウェアなど。より多くの情報があなたを待っています。

おすすめ

転載: blog.csdn.net/weixin_34311210/article/details/110504827