bootstrap.servers
一般只需要配置3至4台的broker ,这样producer一旦连接到集群中的任一台,就能够那道整个集群的broker信息
acks
0 代表不用等待就认为成功 1 leader成功就认为成功 all所有副本成功就认为成功
当需要保证消息不丢,这个需要设置成all
针对producer的同步发送
producer.send() 这个是异步发送
producer.send().get() 这个是阻塞发送
producer什么时候建立与broker的TCP连接?
1、默认在producer初始化的时候建立跟broker的连接
除了最开始初始化,producer还会在更新元数据,或者发送数据时尝试建立TCP连接。
1、producer往一个不存在的主题发送消息。发现主题不存在,producer会重新拉取新的元数据,然后重新建立连接
2、producer通过metadata.max.age.ms 参数定期的更新元数据信息,默认值是300000 。默认5分钟,每5分钟拉取最新的元数据信息
何时关闭TCP连接?
1、用户自己关闭。比如用producer.close()
2、程序自己关闭。producer的参数connection.max.idle.ms 默认9分钟,9分钟连接空闲,就会关闭
事务Producer
使用参数 enable.idempotence true
实际上是保证多条消息同时投递到kafka,它能保证跨分区,跨会话间的幂等性。
针对事务producer 发送事务消息,一定要设置事务ID
同时消费者要设置isolation.level:read_committed 表示允许消费的是已提交的消息[这个包含非事务的单发消息]
特别注意:性能会有所牺牲
如何保证producer消息不丢失
1、topic配置 开启分区副本数要大于2
2、producer配置参数
ACKS_CONFIG =all
3、broker配置
min.insync.replicas 大于1
min.insync.replicas=2
4、producer.send(record,callbeak);在callback知道结果
kafka开发建议
1、可以利用key+分区策略 实现顺序性
2、如果带宽 和CPU 有限制,可以开启kafka的压缩,也可以自己在程序中实现压缩
Producer 端压缩、Broker 端保持、Consumer端解压缩。
如果在producer使用了压缩,broker为了保证crc校验,会启动解压,这个解压缩不可避免【broker实际上是一个对IO要求高,对CPU要求不高的性质,所以在解压缩方面,不用太担心对broker的CPU影响太大】
目前kafka 已经可以绕过这部分的解压缩
特别注意
key设置的重要性,一方面key设置不同值,可以保证在进行业务跟踪时的准确性。另一方面在进行选择分区的时候,默认就是利用key去选择不同的分区,如果将key设置相同,会有可能将消息投递到同一个分区,从而造成分区数据倾斜