kafka权威指南(二):Kafka生产者

一、生产者

使用场景分析:

  • 是否每个消息都很重要?
  • 是否允许丢失一小部分信息
  • 偶尔出现重复信息是否可以接受?
  • 是否有严格的延迟和吞吐量要求?

几种实际应用场景:

  1. 信用卡事务处理系统:不允许消息丢失和重复,可以接受的最大延迟为500ms
  2. 保存网站的点击信息:允许少量的消息丢失和重复,延迟可以高一些

二、生产者工作流程

  1. 创建ProducerRecord对象,包含:目标主题、要发送的内容、指定分区(可选)、指定键(可选)
  2. 序列化:生产者将键和值对象序列化成字节数组
  3. 选取数据存储分区:序列化后的数据会传给分区器
    1. 如果数据中已经指定了分区,直接将这个分区返回
    2. 没有指定,使用ProducerRecord对象的键来选择一个分区返回
  4. 将该条记录添加到一个记录批次中:相同批次的记录会被存储到相同的主题主题和分区。kafka会使用独立的线程将这些记录发送到对应的broker上。
  5. 服务器(brker)收到消息,返回响应信息
    1. 消息成功写入:返回RecordMetaData,包含消息的主题和分区,还有消息在分区中的偏移量
    2. 写入失败:返回一个错误,生产者(Producer)收到错误,尝试重新发送消息,重复几次均失败后,就返回给应用程序错误信息。

三、创建kafka生产者

设置属性:

  • bootstrap.servers:指定broker的地址清单,格式( host:port),逗号分隔
  • key.serializer(必须设置):必须被设置为一个实现了 org.apache.kafka.common.serialization.Serializer 接口的类,常见的有:
    •  ByteArraySerializer(可操作的事情很少)
    •  StringSerializer
    • IntegerSerializer
  • value.serializer:同key.serializer

发送消息的三种方式:

  • 发送并忘记:把消息发送给服务器,但是不关心消息是否到达
  • 同步发送:使用send()发送信息,它会返回一个 Future 对象,调用 get() 方法进行等待,就可以知道消息是否发送成功。
  • 异步发送:调用send(),并指明一个回调函数,服务器在返回响应时调用该函数。

四、使用Kafka的Java API向topic发送消息时出现的问题分析(必管用)

环境:window JavaAPI、Linux kafka broker

使用本地项目连接远程broker服务器的时候,总是提示连接超时什么的,上网搜了很多信息,要不就是说到了点子上该怎么做提示 的不够全面,要不就是干脆胡说八道。这里给出给出一个解决方案:

1.首先确保你的broker是正常启动的

2.检查服务器防火墙有没有关掉,不检查也行。我在这一步花了三个小时。。。

3.检查你的服务器 9092的端口是否对外开放,自己买的服务器登录云控制台就可以修改。

4.上边三步都对为什么还是连不上?因为你没有配置呀!!!kafka/config文件夹的server.proterties你看过么?

5.目前如果只是自己连接外网kafka,把linstener注释掉,把advertised.listeners注释解开就行了,什么hostname什么的,费那劲干嘛?!!!想了解为什么的就可以去网上找答案了。

advertised.listeners=PLAINTEXT://=server_ip:9092(server_ip是你kafka服务器的 外网IP)

6.java代码的参数设置

//server_ip是你的kafka服务器的外网ip
Properties kaflaResource = new Properties();
        kaflaResource.put("bootstrap.servers", "server_ip:9092");

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章