一、生产者
使用场景分析:
- 是否每个消息都很重要?
- 是否允许丢失一小部分信息
- 偶尔出现重复信息是否可以接受?
- 是否有严格的延迟和吞吐量要求?
几种实际应用场景:
- 信用卡事务处理系统:不允许消息丢失和重复,可以接受的最大延迟为500ms
- 保存网站的点击信息:允许少量的消息丢失和重复,延迟可以高一些
二、生产者工作流程
- 创建ProducerRecord对象,包含:目标主题、要发送的内容、指定分区(可选)、指定键(可选)
- 序列化:生产者将键和值对象序列化成字节数组
- 选取数据存储分区:序列化后的数据会传给分区器
- 如果数据中已经指定了分区,直接将这个分区返回
- 没有指定,使用ProducerRecord对象的键来选择一个分区返回
- 将该条记录添加到一个记录批次中:相同批次的记录会被存储到相同的主题主题和分区。kafka会使用独立的线程将这些记录发送到对应的broker上。
- 服务器(brker)收到消息,返回响应信息:
- 消息成功写入:返回RecordMetaData,包含消息的主题和分区,还有消息在分区中的偏移量
- 写入失败:返回一个错误,生产者(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");