先介绍一下场景吧,我手头有两个项目,两个项目都如其的相似
项目一、类似于怪兽充电的电池物联网节点与云端的数据中心
项目二、汽车分包电池信息物联网设备节点与云数据中心推送
相同点、两个都是基于stream流的数据,而且都是消息上传和控制指令。我前期在项目二中引申了一个物联网单节点项目,也是我现在公司的项目,第一版这是整完了吧,第二版的架构我就开始找方案了(最终的蓝本应该基于云的物联管理平台)。
先初定了一下需求:
- 协议兼容http、tcp、udp、websocket
- 需要负载均衡
- 需要热点部署
- 需要消息订阅与推送
- 兼容多套解析语言的API
- 要求易用性
我默默的放下了手上正在造的C++消息服务器,找到了我一个在某国企的大数据的老伙计,问了相关的技术要点。
现在都流行这么玩:
前端负载均衡+消息队列+后台逻辑
然后就找到了 nginx + kafka + C++ 这条路(更早之前我想的 mqtt 协议 nginx+EMQ)协议mqtt。觉得不妥。协议定死了后面怎么办,再整一套?显然陷入不必要的开发。
kafka
引入一篇文章 https://www.cnblogs.com/ken-io/p/kafka-cluster-deploy-guide.html
里面定义的概念先看一下
概念/对象 | 简单说明 |
---|---|
Broker | Kafka节点 |
Topic | 主题,用来承载消息 |
Partition | 分区,用于主题分片存储 |
Producer | 生产者,向主题发布消息的应用 |
Consumer | 消费者,从主题订阅消息的应用 |
Consumer Group | 消费者组,由多个消费者组成 |
原文内容:在Kafka集群(Cluster)中,一个Kafka节点就是一个Broker,消息由Topic来承载,可以存储在1个或多个Partition中。发布消息的应用为Producer、消费消息的应用为Consumer,多个Consumer可以促成Consumer Group共同消费一个Topic中的消息。
有了这个概念不妨先把kafka整个集群看成水管,我不管这个节点是一个还是多个。我只关心我的出水口和出水口。也就是概念所说的Producer(生产者)与 Consumer(消费者)。
安装kafka
下载Kafka源码 https://kafka.apache.org/downloads 我的版本2.6.0
下载zookeeper https://zookeeper.apache.org/releases.html 我的版本 3.4.5
zookeeper是日志收集系统 kafka会用这个组件
我的系统Centos7-Desktop 自带jbk1.8,如果没有jdk请安装(kafka是scala开发的需要java)
yum install java-1.8.0-openjdk* -y
拷贝kafka和zookeeper到 /usr/local/
更改当前kafka指定的zookeeper位置(/usr/local/zookeeper)
更改kafka服务配置两项listeners
启动kafka
cd /usr/local/kafka
bin/kafka-server-start.sh -daemon config/server.properties
设置日志转发IP和kafka分区(partitions)和主题(topic)
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
--create 新建topic主题
--zookeeper 指定zookeeper日志管理系统 localhost:2181 指定传输地址本地IP:2181
--replication-factor 1 指定当前主题副本量 应当小于等于你的kafka节点
--partitions 1 指定当前主题中有一个分区
--topic test 当前主题名称为test
replication-factor:用来设置主题的副本数。每个主题可以有多个副本,副本位于集群中不同的broker上,也就是说副本的数量不能超过broker的数量,否则创建主题时会失败。(也就是说你的必须小于等于kafka节点数量)这里我单节点所以只有一个副本。
查看当前topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
列出指定主题下所有的topic
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
开启kafka生产者
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
开启kafaka消费者
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
--bootstrap-server 服务主机master节点及端口号
--topic test 主题test
--from-beginning 从传递的历史消息点开始读取
从生产者发送任意信息消费者接收
给我的感觉吧kafka更像一个封装好的pipe,功能比fileio stdio强大多了,最主要的还是集群式的。消息订阅是多API的(C++、Python、Java)。