Tcp/Ip如何工作 (Kafka producer机制)
Application如果需要发送消息,是先发到操作系统的socket write buffer. 如果buffer(queue)满了,就是tcp congestion。同样的,外部来的消息会先到操作系统的socket receive buffer.如果buffer满了,操作系统就不会ack那个消息,也是congestion。
这个buffer的尺寸并不大,可以通过一下命令查询。参数分别代表,min, default, max:
liangqi@nuci5-2:~$ cat /proc/sys/net/ipv4/tcp_rmem
4096 131072 6291456
liangqi@nuci5-2:~$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
之所以看到是因为看这篇文章
http://cloudurable.com/blog/kafka-tutorial-kafka-producer-advanced-java-examples/index.html#:~:text=The%20Kafka%20Producer%20has%20a,acks%20to%20control%20record%20durability.
如果act是0,那么application只是把消息送到socket buffer就可以了。
还有一个配置参数 buffer.memory
这个是application level的setting,当broker无法访问,就会把消息放在内存中等待,在 max.block.ms
到期之前,send就会等待,到期就会抛一场。producer 也有重试机制。
但是这里有一个疑问,broker不可访问,是不是操作系统的socket write buffer也会满?我觉得不会,如果socket buffer满了就会影响所有的application,这个相当于外部的一个目标无法访问就导致所有的对外连接失效。应该是有一个机制操作系统知道外部网络不可送达,然后就会清楚缓存,告诉application目标不可达,然后application就会cache请求,然后不断的重试。
https://stackoverflow.com/questions/49649241/apache-kafka-batch-size-vs-buffer-memory