青训营的课程中,提到了三种消息队列——Kafka、BMQ、RocketMQ。本文是对Kafka的笔记与使用记录。
什么是消息队列
百科上是这么说的:
消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件用来处理一系列的输入,通常是来自使用者。消息队列提供了异步的通信协议,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。
它有以下特点:
- 异步处理(Asynchronous) - 发送者和接收者不需要同时交互。
- 解耦(Decoupled) - 发送者和接收者之间松散耦合。
- 消息的推送(Push) - 消息被发送推送到队列中,而不是拉取。
- 数据流转(Data Streaming) - 消息可以连续不断地流转,而不会阻塞。
- 削峰 - 由于避免了大量的同步请求,同时存在网络中的链接会减少。
当然,还有其他的一些特点。多数消息队列可以永久保存消息,借此可以保证消息一定传达到。这缓解了宕机时发生的数据丢失问题。永久保存消息,一般需要在使用前传递好参数。一般场景下,必须永久保存消息(毕竟丢失数据的损失可太大了)。
安装Kafka
在Kafka官网上,提供了安装包,大家可以去下载、解包,之后就可以使用了。但是在Archlinux下,依然还是可以直接一行命令安装好
sudo pacman -S kafka
但是这次就没有那么好使了。因为要运行起来kafka,就必须指定一个配置文件,而这个配置文件并没有放在这个软件包里面,所以还是得去官网下载kafka。
使用Kafka
Kafka本身就是一个程序,一个服务端,所以你得手动启动这个服务端才行,但是在那之前,你得开启服务注册与发现服务——zookeeper。
cd 解包后的zookeeper路径
vi conf/zoo.cfg
写入以下内容:
tickTime=2000
dataDir=数据存储目录
clientPort=2181
使用下面的命令执行
bin/zkServer.sh start
如果提示已经启动了,那么这一步就完事了。下面启动kafka
cd 解包后的kafka路径
bin/kafka-server-start.sh config/server.properties
如果说找不到文件或没有权限,十有八九是你没有更改文件权限为可执行,也就是说,用chmod给他执行权限。
编写golang测试一下
这里选用的是github.com/segmentio/kafka-go 的go客户端。把他们的示例代码复制来,可能会遇到以下几个名词:
- Topic :我当成消息分类用的。比如说你发的消息,希望是这样的:客户端只能发给指定的服务端。
- Broker:服务器节点,Kafka也是支持服务器集群的,所以就称一个服务器节点为一个Broker。
- Reader和Writer:本身就是加速用的,拿着使用就是了。
- TLS :传输层加密,它是安全加强的,你可以不用。
以下是其执行结果