kafka Producer的实现比较简单, 按照 sarama 的go语言实现, 简单说下:

AsyncProducer -> topicProducer -> partitionProducer -> brokerProducer -> Broker  

无论是 哪一种Producer的实现, 都是通过 channel 实现异步的send 和 dispatcher. 为了避免 broker 元数据发生变化, 消息发送给 错误的broker, 在 启动的时候, 会获取producer leader进行消息发送, 同时如果发送失败, 就会 关闭当前的broker[客户端broker的概念, 对应着 kafka producer的一个实例].

producer 发送消息到哪一个Partition,可以自定义partition策略, 默认的有 randomPartitioner、roundRobinPartitioner、hashPartitioner.