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
的效果。install
go get -u github.com/hpcloud/tail
一个例子:
|
|