在客户端调用send方法时,需要先构造好ProducerRecord对象,其包含以下字段
- 如果在发送时指定了partition,则消息将被保存到指定的tp分区队列,
- 如果没有指定分区,将对key散列后来计算分区,相同key的消息将被写到同一个分区队列中,
- 如果key是null,且使用默认的分区器,
- 则分区器将用轮询的方法(Round Robin)将序列化后的消息均衡分布到不同的队列中
- sender线程从Accumulator中取出批量数据组成一个batch发送
如果想使用同步方式,
- 其实是通过异步方式间接实现,
- 因为异步方式返回的是一个future对象,
- 在这对象上调用get方法,将被阻塞直到返回结果。
下图详细描述了数据发送到accumulator及sender线程从accumulator取出并发送到broker的过程
https://www.cnblogs.com/benfly/p/10000034.html