kafka分区失败的原因分析

£可爱£侵袭症+ 提交于 2020-04-06 18:35:30

之前无论采取哪种分区模式都无法进行分区

生产者的分区的分割器 分区选择在多个分区存在的情况下,决定将消息发送到哪个分区.

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. 没有设置分区个数(默认为1),单分个数设置为5个是,同一主题下的数据会被分为5个区,进行保存。
  2. 生产者在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)
		}
	}
}

``
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!