同步的函数调函数异步化;进程间的通信。高吞吐、低延迟、高容错。
1 消息队列的通信模式
1.1 点对点模式(queue)
消息生产者将消息发送到queue中,然后消息消费者从queue中取消息。一个消息被消费以后就没有了,不存在重复消费。
1.2 发布订阅模式(topic)
消息生产者发布消息到topic中,同时多个消息消费者消费该消息。与点对点模式不同,发送到topic的消息会被所有订阅者消费。(类似微信公众号推送)
1 kafka的安装
安装kafka需要依赖zookeeper的,所以安装kafka的时候也会包含zooker。
brew install kafka
Kafka是一种高吞吐量的分布式发布消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展等特点。
2 kafka 简介
- 消息记录:由一个key,一个value和一个时间戳构成,消息最终存储在主题下的分区中,记录在生产中称为生产者记录,在消费者中称为消费记录。Kafka集群保持了所有发布的消息,直到它们过期,无论消息是否被消费了,在一个可配置的时间段内,Kafka集群保留了所有发布的消息。比如消息的保存策略被设置为2天,那么在一个消息被发布的两天时间内,它都是可以被消费的。Kafka的性能是和数据量无关的常量级的,所以保留太多数据并不是问题。
- 生成者:生产者用于发布消息。
- 消费者:消费者用于订阅消息。
- offset:每个消息在被添加到分区时,都会被分配一个 offset(称之为偏移量),它是消息在此分区中的唯一编号,kafka 通过 offset 保证消息在分区内的顺序。offset 的顺序不跨分区,即 kafka 只保证在同一个分区内的消息是有序的; 对于应用层的消费来说,每次消费一个消息并且提交以后,会保存当前消费到的最近的一个 offset。
- 消费者组:相同的groupID的消费者将视为同一个消费者组,每个消费者都需要设置一个组id,每条消息只能被consumer group中的一个Consumer消费,但是可以被多个consumer group消费。
- 主题(topic):topic是存储消息的逻辑概念,不同的topic下的数据是分开存储的。不同的 topic 的消息是分开存储的, 每个 topic 可以有多个生产者向它发送消息,也可以有多 个消费者去消费其中的消息。 消息的一种逻辑分组,用于对消息分门别类,每一类消息称之为一个主题,相同主题的消息放在一个队列中。
- 分区(partition):一个 topic 可以划分多个分区partition(每个 Topic至少有一个分区partition),同一topic下的不同分区包含的消息是不同的。第i个分区分配在第 i mod n 个broker上。每个消息在被添加到分区时,都会被分配一个offset(称之为偏移量),它是消息在此分区中的唯一编号,kafka通过offset 保证消息在分区内的顺序,offset的顺序不跨分区,即kafka 只保证在同一个分区内的消息是有序的。 消息的一种物理分组,一个主题被拆成多个分区,每一个分区就是一个顺序的,不可变的消息队列,并且可以持续添加,分区中的每个消息都被分配了一个唯一的id,称之为偏移量(offset),在每个分区中偏移量都是唯一的。每个分区对应一个逻辑log,有多个segment组成。
- 偏移量:分区中每个消息都有一个唯一的Id,称之为偏移量,代表已经消费的位置。
- 代理(broker):一台kafka服务器称之为一个broker。
- 副本(replica):副本只是一个分区(partition)的备份。副本不读取或写入数据。它们用于防止数据丢失。
- 领导者:leader是负责给定分区的所有读取和写入的节点。
- 追随者:跟随领导者指令的节点被称为Follower。
- zookeeper:Kafka代理是无状态的,所以它们使用Zookeeper来维护它们的集群状态。Zookeeper用于管理和协调Kafka代理。
kafka功能
- 发布订阅:生产者生产消息(数据流),将消息发送给kafka指定的主题队列中,也可以发送到topic中的指定分区中,消费者从kafka的指定队列中获取消息,然后来处理消息。
3 sarama
Go语言中连接kafka使用第三方库:github.com/Shopify/sarama
注意:
sarama v1.20之后的版本加入了zstd压缩算法,需要用到cgo,在Windows平台编译时会提示类似如下错误:
————————————
github.com/DataDog/zstd
exec: “gcc”:executable file not found in %PATH%
所以在Windows平台请使用v1.19版本的sarama。
4 实例
4.1 生产者
import (
"fmt"
"github.com/Shopify/sarama"
)
func mai