高级问题
我在本地运行kafka,并且使用的是压缩主题。当我运行命令行生产者和使用者时,我可以验证是否进行了压缩,但是当我使用sarama(“ github.com/Shopify/sarama”)生产者时,似乎没有发生日志压缩。
验证日志压缩
首先,我使用以下命令创建了一个主题:
bin/kafka-topics.sh --zookeeper localhost:2181 \
--create --topic andrew.topic \
--config "cleanup.policy=compact" \
--config "delete.retention.ms=100" \
--config "segment.ms=100" \
--config "min.cleanable.dirty.ratio=0.01" \
--partitions 1 \
--replication-factor 1
接下来,我将使用以下内容向其发送一些消息:
for i in $(seq 0 10); do \
echo "sameKey123:differentMessage$i" | bin/kafka-console-producer.sh \
--broker-list localhost:9091 \
--topic andrew.topic \
--property "parse.key=true" \
--property "key.separator=:"; \
done
最后验证是否发生日志压缩:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9091 \
--topic andrew.topic \
--property print.key=true \
--property key.separator=" : " \
--from-beginning
哪些印刷品:
sameKey123 : differentMessage9
sameKey123 : differentMessage10
因此,正在对andrew.topic主题进行日志压缩。
正在使用Sarama
现在,我使用sarama为以下相同主题生成消息:
package main
import (
"fmt"
"github.com/Shopify/sarama"
"os"
"os/signal"
)
func main() {
sendMessages()
}
func sendMessages() {
producer, err := sarama.NewSyncProducer([]string{"localhost:9091"}, nil)
if err != nil {
panic(err)
}
defer func() {
if err := producer.Close(); err != nil {
panic(err)
}
}()
for i := 0; i <= 10; i++ {
pm := &sarama.ProducerMessage{
Topic: "andrew.topic",
Key: sarama.StringEncoder("sameSaramaKey123"),
Value: sarama.StringEncoder(fmt.Sprintf("differentMessage%v", i)),
}
_, _, err := producer.SendMessage(pm)
if err != nil {
panic(err)
}
}
}
在命令行上重新启动使用者后,我看到以下输出
sameKey123 : differentMessage9
sameKey123 : differentMessage10
sameSaramaKey123 : differentMessage0
sameSaramaKey123 : differentMessage1
sameSaramaKey123 : differentMessage2
sameSaramaKey123 : differentMessage3
sameSaramaKey123 : differentMessage4
sameSaramaKey123 : differentMessage5
sameSaramaKey123 : differentMessage6
sameSaramaKey123 : differentMessage7
sameSaramaKey123 : differentMessage8
sameSaramaKey123 : differentMessage9
sameSaramaKey123 : differentMessage10
此处未进行日志压缩。无论我重新启动使用者多少次,或者用sarama日志压缩生成的消息似乎都不会出现。
更古怪
如果在使用sarama生成消息之后,然后在命令行日志压缩时又生成了更多消息,则发生
运行sarama生产者后,运行终端生产者后,我得到以下输出
sameSaramaKey123 : differentMessage10
sameKey123 : differentMessage9
sameKey123 : differentMessage10
在终端上运行生产者后,将对所有消息进行日志压缩,包括先前由sarama产生的消息。
为什么会这样?我该如何解决?