kafka的Java生产者如何管理TCP连接

为何要使用TCP

  Apache Kafka的所有通信都是基于TCP的,而不是基于HTTP或者其它协议。无论是生产者,消费者,还是Broker之间的通信都是基于TCP。此时就会问:为什么不用HTTP呢?
  不用HTTP原因如下:
1:人们可以利用TCP本身提供的一些高级功能,比如:多路服用请求以及同时轮询多个连接的能力。
2:目前已知的HTTP库在很多编程语言中都略显简陋。

开发一个生产者程序的步骤

1:构造生产者对象所需的参数对象。
2:利用第一步的参数对象,创建KafkaProducer对象实例
3:使用KafkaProducer的send方法发送消息。
4:调用KafkaProducer的close方法关闭生产者并释放各种系统资源。


Properties props = new Properties ();
props.put(“参数1, “参数1的值”);
props.put(“参数2, “参数2的值”);
……
try (Producer<String, String> producer = new KafkaProducer<>(props)) {
            producer.send(new ProducerRecord<String, String>(……), callback);
  ……
}

什么时候创建TCP连接?

  首先根据上面代码,我们得知可能创建连接的地方有两个:
一个是创建生产者实例对象时,
一个是发送消息时。

创建连接地方

  实际上,在创建实例对象时,会创建所有的TCP连接,但是在发送消息时,也可能会创建TCP连接,另外它在更新元数据后也可能会创建TCP连接。
  一个一个讲解:
  创建实例对象时:生产者应用会在后台创建并启动一个名为Sender的线程,该线程开始运行时首先会创建与Broker的连接。它会连接bootstrap.servers参数指定的所有Broker。(上面的参数指定了这个Producer启动时要连接的Borker地址)
  在实际使用过程中,在上面的参数中,通常指定3-4台就可以了,因为Producer一旦连接到集群中的任一台Broker,就能拿到整个集群的Broker信息。
   更新元数据后,如果发现与某些Broker当前没有连接,那么它就会创建一个TCP连接。
  发送消息时,如果发现与目标Broker的连接不存在,也会创建一个TCP连接。

什么时候会更新元数据呢?有两种情况:

1:Producer尝试给一个不存在的主题发送消息时,Broker会告诉生产者,主题不存在,此时生产者会发送METADATA请求给kafka集群,去尝试获取最新的元数据信息。
2:通过metadata.max.age.ms参数定期地去更新元数据信息。该参数默认是300000,也就是五分钟。

何时关闭连接

  有两种情况:一种是用户主动关闭;一种是 Kafka 自动关闭。
1:用户主动关闭:
  用户调用close方法,甚至用户将生产者进程杀掉都算主档关闭。
2:自动关闭:
  这与Producer端参数connections.max.idle.ms的值有关。默认情况下是九分钟。如果九分钟内没有任何请求流过某个TCP连接,kafka就会主动关闭该连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值