随便写写Kafka,并且大俗特俗的从安装操作开始写起。
Kafka 的安装 首先要有 jdk! 其次要有 zookeeper!不过kafka的发行版压缩包中,已经集成了zookeeper。 从官网下载最新版的Kafka,解压后就可以直接使用了。
启动zookeeper:
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 启动Kafka
bin/kafka-server-start.sh -daemon config/server.properties 这样一个单节点的Kafka就启动了。早期的版本启动的时候还需要使用 nohup 来放到后台。现在只需要带 -daemon 参数了。
Kafka 的操作 只列几个常用的命令,更多的命令可以到官网上去翻文档。
创建topic bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic etl-kafka --partitions 24 --replication-factor 1 列出所有的topic bin/kafka-topics.sh --zookeeper localhost:2181 --list 查看topic信息 bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic etl-kafka 测试发送消息 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic etl-kafka 测试接受消息 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic etl-kafka --from-beginning 以上是最常用的命令,此外还有些管理 topic 的命令,如
源起 docker并不是新技术。作为 golang 社区内的旗舰级的项目,从诞生之初就吸引了很多人的瞩目,甚至可以说是获得了所有 golang 社区的人多瞩目吧。同时对推广 golang 也起了很大的作用。作为从一直关注着 golang 的人,大概2年前就开始尝试使用它了。不过由于其依赖 linux 的多项特性,导致在 mac 上使用必须要借助虚拟机,体验总是要差一点。最近经人提醒发现新的 docker for mac 可以不借助虚拟机就可以在 mac 上提供与 linux 上同样的体验,大喜!遂卸载虚拟机,打算用新软件搭个测试环境玩耍一下。
安装 超级简单,照着说明来就好。顺便装上了 kitematic。这个确实也非常好用。
目标 将一套以前用 python 实现的 kafka producer程序,移植到 golang 上。测试新程序的异常情况处理(特指连接失败的处理)。 然后就被坑掉了。
坑1 网络的问题 最初只是想通过 docker 启动一个单点的 kafka,程序通过本地网络直接访问就可以了。通过之前安装的 kitematic 从 hub.docker.com 上下载了 spotify/kafka 镜像,并直接启动容器。通过kitematic连接到容器内,各项命令执行正常。但是执行程序的时候却发现,总是第一次连接成功后,后边的所有连接都是失败的。通过日志发现程序在第一次成功连接 kafka 之后,连接地址发生了变更,变成了容器内部的地址(直观的现象就是,端口从 kitematic 随机生成的 12345 变成了 9092)。然后又尝试了手动用 –net=host 方式启动,结果彻底连不上了。
在对 github.com/shopify/sarama 简单的分析以后,发现它的连接过程是这样的:
首次连接,根据配置信息连接服务器
连接成功后,从服务器获取broker信息 根据获得到的broker信息,连接其余的broker 问题就出现在最后一步上,服务器返回的broker信息中,网络地址都是容器内部的网络,没有办法从容器网络外部直接连接的。
通过在github上查 issue, google 上查资料,有了以下不负责任的猜想: