kafka

本文介绍如何使用Kafka进行消息发布与订阅。通过示例代码,演示了生产者如何向Kafka主题发送消息,以及消费者如何订阅并消费这些消息。详细解释了配置参数的作用,如acks、retries、batch.size等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例一:

生产者

package kafka

import java.util.Properties

import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}

object Producter {
  def main(args: Array[String]): Unit = {

    val props = new Properties ()
    //服务器
    props.put ( "bootstrap.servers", "192.168.186.150:9092" )
    //acks配置控制请求被认为是完整的标准。我们指定的“all”设置将导致阻塞记录的完全提交,这是最慢但最持久的设置。
    props.put ( "acks", "all" )
    //如果请求失败,生产者可以自动重试,但由于我们已经将重试指定为0,所以它不会。启用重试也会增加重复的可能性(有关消息传递语义的文档中有详细信息)。
   // props.put ( "retries", 0 )
    //生产者维护每个分区的未发送记录的缓冲区。这些缓冲区的大小由batch.size配置指定。使得这个较大的可能导致更多的批处理,
    // 但需要更多的内存(因为我们通常会为每个活动分区拥有这些缓冲区之一)。
    //props.put ( "batch.size", 16384 )
    //默认情况下,即使缓冲区中有其他未使用的空间,也可以立即发送缓冲区。但是,如果您想减少请求的数量,可以将linger.ms设置为大于0的值。
    // 这将指示生产者在发送请求之前等待这个数毫秒,希望更多的记录将到达以填满同一批。这类似于Nagle在TCP中的算法。
    // 例如,在上面的代码片段中,由于我们将逗留时间设置为1毫秒,很可能所有100条记录都是在一个请求中发送的。
    // 但是,如果不填充缓冲区,此设置将为我们的请求增加1毫秒的延迟,等待更多的记录到达。
    // 请注意,在时间上接近到达的记录通常会批处理到一起,即使使用linger.ms=0,因此在重负载批处理下,
    // 无论逗留配置如何,都会发生批处理;但是,将其设置为大于0的值会导致在没有最大负载的情况下,以少量延迟为代价的更少、更高效的请求。
   // props.put ( "linger.ms", 1 )
    //buffer.memory控制生产者可用于缓冲的内存总量。如果记录的发送速度超过了将其传输到服务器的速度,那么这个缓冲区空间就会耗尽。
    // 当缓冲区空间耗尽时,额外的发送调用将被阻塞。阻塞时间的阈值由max.block.ms确定,然后抛出一个TimeoutException。
    //props.put ( "buffer.memory", 33554432 )
    //key.serializer和value.serializer指示如何将用户提供的密钥和值对象转换为字节。您可以使用包含的ByteraySerializer或StringSerializer来实现简单的字符串或字节类型。
    props.put ( "key.serializer", "org.apache.kafka.common.serialization.StringSerializer" )
    props.put ( "value.serializer", "org.apache.kafka.common.serialization.StringSerializer" )
    val producter = new KafkaProducer[String, String]( props )
    /**
      * private val topic: String = null
      * private val partition: Integer = null
      * private val key: K = null
      * private val value: V = null
      * private val timestamp: Long = 0L
      */
    var i = 0
    while (i < 100) {
      val pro = new ProducerRecord[String, String]( "hello", i % 3, "" + i, "" + i )
      producter.send ( pro )

      //睡眠
      Thread.sleep ( 2000 )
      println ( "生产者数据: 分区:" + pro.partition () + " key:" + pro.key () + " value:" + pro.value () )
      i += 1
    }

    producter.close ()

  }
}

 

消费者

package kafka

import java.util

import org.apache.kafka.clients.consumer.{ConsumerRecord, KafkaConsumer}

object consumerDemo01 {
  def main(args: Array[String]): Unit = {
    val map = new util.HashMap[String, Object]()
    //通过使用configuration   bootstrap.servers指定要联系的一个或多个代理程序的列表,可以引导与群集的连接。此列表仅用于发现群集中的其余代理,
    // 并且不需要是群集中服务器的详尽列表(尽管在客户端连接时服务器出现故障时,您可能需要指定多个服务器)。
    map.put ( "bootstrap.servers", "192.168.186.150:9092" )
    //在本例中,使用者作为一组名为test的消费者的一部分订阅主题foo和bar,并配置为group.id。
    map.put ( "group.id", "test" )
    //设置enable.auto.commit意味着偏移以配置auto.commit.interval.ms.控制的频率自动提交
    map.put ( "enable.auto.commit", "true" )
    map.put ( "auto.commit.interval.ms", "1000" )

    map.put ( "key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer" )
    map.put ( "value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer" )

    val consumer = new KafkaConsumer[String, String]( map )

    consumer.subscribe ( util.Arrays.asList ( "hello" ) )
    while (true) {
      //如果缓冲区中没有数据可用,则以100毫秒为单位的时间在轮询中等待.如果0,立即返回缓冲区中可用的任何记录,否则返回空。不得为负数。
      val records = consumer.poll ( 1000 )
      val result: util.Iterator[ConsumerRecord[String, String]] = records.iterator ()
      while (result.hasNext) {
        val r = result.next ()
        println ( "消费者数据是:偏移量:" + r.offset () + " 分区:" + r.partition () + " K: " + r.key () + " value: " + r.value () )
      }
    }
  }
}

 

转载于:https://www.cnblogs.com/wangshuang123/p/11133273.html

06-07
### Kafka 使用教程和核心技术详解 Kafka 是一个分布式流处理平台,最初由 LinkedIn 开发,并于 2011 年开源。它被设计为高吞吐量、低延迟的消息系统,广泛用于日志收集、监控数据聚合、流式数据处理等领域[^1]。 #### Kafka 的核心概念 Kafka 的架构围绕几个关键概念展开: - **主题(Topic)**:Kafka 中消息的类别或提要名称。生产者将消息发布到特定主题,消费者从主题中订阅消息。 - **分区(Partition)**:每个主题可以划分为多个分区,分区是 Kafka 中并行处理的基础单位。 - **副本(Replica)**:为了提高可靠性,Kafka 会为每个分区创建多个副本,分布在不同的 Broker 上。 - **消费者组(Consumer Group)**:消费者可以组成一个组来共同消费一个主题的消息,组内的每个消费者负责处理一部分分区的消息[^2]。 #### Kafka 的使用方法 Kafka 提供了多种客户端库以支持不同编程语言的开发。以下是一个简单的 Python 示例,展示如何使用 Kafka 生产者和消费者: ```python from kafka import KafkaProducer, KafkaConsumer # 创建 Kafka 生产者 producer = KafkaProducer(bootstrap_servers='localhost:9092') # 发送消息到指定主题 producer.send('my-topic', b'Hello, Kafka!') producer.flush() producer.close() # 创建 Kafka 消费者 consumer = KafkaConsumer( 'my-topic', bootstrap_servers='localhost:9092', auto_offset_reset='earliest', enable_auto_commit=True, group_id='my-group' ) # 消费消息 for message in consumer: print(f"Received message: {message.value.decode('utf-8')}") ``` #### Kafka 的核心技术详解 Kafka 的核心技术主要包括以下几个方面: - **持久化日志**:Kafka 将消息存储在磁盘上,并通过顺序写入操作优化性能。这种设计使得 Kafka 能够提供高吞吐量和持久性保证。 - **分区与并行性**:通过将主题划分为多个分区,Kafka 实现了水平扩展的能力。每个分区可以独立地被多个消费者消费。 - **复制机制**:Kafka 的复制机制确保了即使某些 Broker 出现故障,数据仍然可用。领导者分区负责读写操作,而跟随者分区则同步数据[^3]。 - **消费者偏移量管理**:Kafka 允许消费者自行管理偏移量,这为灵活的消费模式提供了支持,例如重新消费旧消息或跳过某些消息。 #### Kafka 的学习资料 对于初学者,可以从官方文档入手,了解 Kafka 的基本概念和配置选项。此外,还有许多在线课程和书籍可以帮助深入理解 Kafka 的原理和实践[^4]。 ```markdown - 官方文档: https://kafka.apache.org/documentation/ - 在线课程: Coursera、Udemy 等平台提供的 Kafka 课程 - 推荐书籍: "Kafka: The Definitive Guide" by Neha Narkhede, Gwen Shapira, and Todd Palino ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值