Golang to Kafka
Go Web 编程
Kafka
Apache Kafka是由著名职业社交公司Linkedln开发的, 最初是被设计用于解决Linkedln公司内部海量日志传输等问题。Kafka使用Scala语言编写。 2011年Linkedln将Kafka开源 并进入Apache孵化器, 2012年10月正式毕业,成为Apache顶级项目。
消息队列通信模型
点对点模式
(Queue)- 生产者 生产消息发送到
queue中, 消费者从queue中取出消息并且消费消息。 一条消息被消费以后,queue中就没有了, 不会有重复消费。
- 生产者 生产消息发送到
发布/订阅
(topic)- 生产者 (发布消息) 将消息发布到
topic中, 同时有多个 消费者 (订阅topic) 消费这条消息。相对于 点对点(queue)方式, 发布到topic中的消息会被 所有 订阅了该topic的消费者进行消费。
- 生产者 (发布消息) 将消息发布到
Kafka 介绍
Kafka是一个分布式数据流服务, 可以运行在单台服务器上, 也可以在多个服务器中部署成集群模式。它提供了发布和订阅的功能, 使用者可以发送数据到Kafka中, 也可以从Kafka中读取数据。Kafka特点:高吞吐量、低延迟 - 每秒可以生产约 25 万消息 (50 MB) , 每秒处理 55 万消息 (110 MB)。
持久化数据存储 - 可进行持久化操作。将消息持久化到磁盘, 因此可用于批量消费, 例如
ETL, 以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。高容错 - 分布式系统易于扩展, 所有的
producer、broker和consumer都可以配置多个, 均为分布式的。无需停机即可扩展机器。 消息被处理的状态是在consumer端维护, 而不是由server端维护。当失败时能自动平衡。
Kafka 架构
Producer- 生产者Kafka Cluster- Kafka 集群Broker- 每一个Kafka Server可以成为一个Broker, 多个Broker就是Kafka Cluster。(单机服务器也可以部署多个Broker, 多个Broker连接到同一个Zookeeper中,就形成了Kafka Cluster)。Topic- 消息类别名, 一个Topic存放一类的消息。每个Topic都有一个或者多个订阅者( consumer ),Producer负责将消息推送到Topic, 然后由 订阅了该Topic的consumer从该Topic中读取消息。一个Broker可以创建一个或多个Topic, 同一个Topic可以分布在同一个Kafka Cluster下的多个Broker中。Partition-Kafka为每个Topic维护多个Partition分区 ( 既数据分片 ), 每个分区都会映射到同一个 逻辑日志文件中。当一条 消息 被发布到Topic上, 这条消息会分布在其中一个Partition中, 并且Broker会将这条 消息 追到逻辑 日志文件的最后一个segment中。每个
Partition都是一个有序的、不可变的结构化的提交日志记录的序列。在每个Partition中每一条日志记录都会被分配一个序号——通常称为offset,offset在Partition内是唯一的。逻辑日志文件会被化分为多个文件segment(每个segment的大小一样的)。Broker集群将会保留所有已发布的 消息records, 不管这些消息是否已被消费。保留时间依赖于一个可配的保留周期。Partition是分布式的存在于一个Kafka Cluster的多个Broker上。每个Partition会被复制多份存在于不同的Broker上。这样做是为了容灾。具体会复制几份, 会复制到哪些Broker上, 都是可以配置的。经过相关的复制策略后, 每个Topic在每个Broker上会驻留一到多个Partition。对于同一个
Partition, 它所在任何一个Broker, 都有能扮演两种角色:leader、follower。Partition在服务器中表现形式为一个一个的文件夹,每个Partition包含多个segment文件。每组的segment文件中 包含三种文件,.index文件,.log文件,.timeindex文件,.log文件是存储 具体 消息 的,.index与.timeindex文件是 索引文件,用于检索与查找具体的消息。
Consumer- 消费者,consumer可以是一个,也可以形成一个consumer Group,每个组包含多个consumer, 共同消费订阅的Topic消息, 提高效率。
Kafka 生产消费流程
Producer首先连接Kafka Cluster并获取Partition的信息, 查找具体的Leader。Producer将 消息 发送给 具体的Partition的Leader。Partition的Leader将消息写入 本地磁盘中。Partition的follower此时会拉取Leader的消息。Partition的follower将消息写入 本地磁盘中, 并发送 ACK 给Leader。Partition的Leader收到 所有follower的 ACK 后 给Producer发送 ACK。
- 注意: ACK =
RequiredAcks, 一共包含三种确认方式, 分别是0不需要 ACK 确认。1只需要Leader确认既可。ALL或-1表示 既需要Leader确认 也需要follower确认。
Golang 操作 Kafka
Go语言操作
Kafka使用sarama这个库。install
| |
- 发送消息到 kafka
| |
| |
- consumer 消费消息
| |
- 启动后会一直等待接收消息
| |
tail 库的使用
使用
hpcloud/tail第三方库, 实现了 类似于 Linux 命令中tail -f的效果。installgo get -u github.com/hpcloud/tail一个例子:
| |