之前无论采取哪种分区模式都无法进行分区
生产者的分区的分割器 分区选择在多个分区存在的情况下,决定将消息发送到哪个分区.
sarama有多个分割器:
sarama.NewManualPartitioner() //返回一个手动选择分区的分割器,也就是获取msg中指定的`partition`
sarama.NewRandomPartitioner() //通过随机函数随机获取一个分区号
sarama.NewRoundRobinPartitioner() //环形选择,也就是在所有分区中循环选择一个(徐工)
sarama.NewHashPartitioner() //通过msg中的key生成hash值,选择分区,
我建议是第3种,刚好均匀分区,
目前我已经修改为5个默认分区,到时候可以均匀分配,
参考文献 https://blog.csdn.net/qq_32292967/article/details/78675116
原因截图
- 没有设置分区个数(默认为1),单分个数设置为5个是,同一主题下的数据会被分为5个区,进行保存。
- 生产者在push数据时,记得设置分区策略。
测试代码
/*
* @Author: Rui XuLe
* @Date: 2019-07-12 22:40:03
* @Last Modified by: Rui XuLe
* @Last Modified time: 2019-07-13 22:05:08
*/
package main
import (
"encoding/json"
"fmt"
"log"
// "math/rand"
"os"
"time"
"github.com/Shopify/sarama"
)
var Address = []string{"100.200.101.75:9092"}
func main() {
p := syncProducerInit(Address)
sendMeg(p)
}
type MegInfo struct {
Name string `json:"name"`
Meg string `json:"meg"`
TimeMeg time.Time `json:"timeTime"`
}
//同步消息模式
func syncProducerInit(address []string) (p sarama.SyncProducer) {
config := sarama.NewConfig()
config.Producer.Return.Successes = true
config.Producer.Timeout = 5 * time.Second
config.Producer.Partitioner = sarama.NewRoundRobinPartitioner
//sarama.NewHashPartitioner()
p, err := sarama.NewSyncProducer(address, config)
if err != nil {
log.Printf("sarama.NewSyncProducer err, message=%s \n", err)
return nil
}
return
}
//主要是 消息的发送
func sendMeg(p sarama.SyncProducer) {
defer p.Close()
topic := "test_go_kafka_producer"
m := MegInfo{
Name: "ruixule",
Meg: "今天是20190720,我在测试gokafka",
TimeMeg: time.Now(),
}
data, _ := json.Marshal(m)
// srcValue := string(data) //"sync: this is ; message. index=%d"
for i := 0; i < 100; i++ {
value := string(data) // fmt.Sprintf(srcValue)
msg := &sarama.ProducerMessage{
//Partition: int32(i),
//Key: sarama.StringEncoder(fmt.Sprintf("%d", rand.Intn(10))),
Timestamp: time.Now(),
Topic: topic,
Value: sarama.ByteEncoder(value),
}
part, offset, err := p.SendMessage(msg)
if err != nil {
log.Printf("send message(%s) err=%s \n", value, err)
} else {
fmt.Fprintf(os.Stdout, value+"发送成功,partition=%d, offset=%d \n", part, offset)
}
}
}
``
来源:oschina
链接:https://my.oschina.net/2018rxl/blog/3220848