文章目录

  • 前言
  • 主流消息队列的对比
  • Nsq和kafka走势强劲
  • 一、Kakfa是什么?
  • Kafka定义?
  • Kafka名字来源?
  • kafka有哪些术语?
  • 二、Kafka解决了什么技术场景或者业务场景?
  • Kafka常用场景
  • 三、Kakfa数据消费过程?
  • 三、Kafka发布-订阅和用户组的工作流程?
  • 四、Zookeeper的作用
  • 五、Kafka安装使用-Kafka docker安装
  • 六、Kafka的客户端有哪些?
  • 总结



前言

消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的资料,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。

主流消息队列的对比

消息队列和socket 消息队列和kafka的区别_kafka


消息队列和socket 消息队列和kafka的区别_kafka_02

  • Kafka地址:https://github.com/apache/kafka
  • RocketMq地址:https://github.com/apache/rocketmq
  • Pulsar地址:https://github.com/apache/pulsar
  • RabbitMq地址:https://github.com/rabbitmq/rabbitmq-server
  • Nsq地址:https://github.com/nsqio/nsq

Nsq和kafka走势强劲

消息队列和socket 消息队列和kafka的区别_消息队列和socket_03


提示:以下是本篇文章正文内容,下面案例可供参考

一、Kakfa是什么?

Kafka定义?

  • kafka是开源流处理平台,由Scala和Java编写(rabitMq由Erlang语言)。本质上是一个按照分布式事务日志架构的发布/订阅消息队列
  • Apache Kafka 是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使你能够将消息从一个端点传递到另一个端点。 Kafka 适合离线和在线消息消费。 Kafka 消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka 构建在 ZooKeeper 同步服务之上。 它与 Apache Storm 和 Spark 非常好地集成,用于实时流式数据分析。
  • Kafka 是一个分布式消息队列,具有高性能、持久化、多副本备份横向扩展能力。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦削峰异步处理的作用。

Kafka名字来源?

  • kafka名字是因为kafka作者喜欢《变形记》作者卡夫卡的作品,于是用kafka作为命名。

kafka有哪些术语?

消息队列和socket 消息队列和kafka的区别_学习_04


消息队列和socket 消息队列和kafka的区别_kafka_05

  • broker(经纪人,代理人): Kafka实例
  • broker:Kafka 集群中有很多台 Server,其中每一台 Server 都可以存储消息,将每一台 Server 称为一个 kafka 实例,也叫做 broker。
  • 一台Server == 一个kafka实例 == 一个broker
  • Topic(主题): 同类消息集合
  • 一个 topic 里保存的是同一类消息,相当于对消息的分类,每个 producer 将消息发送到 kafka 中,都需要指明要存的 topic 是哪个,也就是指明这个消息属于哪一类。
  • Partition(分区):每个 partition 在存储层面是 append log 文件
  • 每个 topic 都可以分成多个 partition,每个 partition 在存储层面是 append log 文件。任何发布到此 partition 的消息都会被直接追加到 log 文件的尾部。为什么要进行分区呢?最根本的原因就是:kafka基于文件进行存储,当文件内容大到一定程度时,很容易达到单个磁盘的上限,因此,采用分区的办法**,一个分区对应一个文件**,这样就可以将数据分别存储到不同的server上去,另外这样做也可以负载均衡,容纳更多的消费者。
  • 分区不是副本,是消息分开存储,类似磁盘分区,如果一个主题有多个分区,那么多个消息就会分别分布在多个分区里面
  • 偏移量(Offset)
  • 一个分区Partition对应一个磁盘上的文件,而消息在文件中的位置就称为 offset(偏移量),offset 为一个 long 型数字,它可以唯一标记一条消息。由于kafka 并没有提供其他额外的索引机制来存储 offset,文件只能顺序的读写,所以在kafka中几乎不允许对消息进行“随机读写”
  • 分组(Group):同组消费者
  • 每个topic的订阅单位都是以组位单位,同一组内的消费者消费消息是互斥的关系,类似我们微信的多个终端,一个处理之后,其他都不用处理。

总之:一个 topic 对应的多个 partition 分散存储到集群中的多个 broker 上,存储方式是一个 partition 对应一个文件,每个 broker 负责存储在自己机器上的 partition 中的消息读写。

二、Kafka解决了什么技术场景或者业务场景?

  • 解决了大数据里面(收集、存储、计算)的存储场景

Kafka常用场景

  • 1、日志服务监控
  • Kafka与ELK(ElasticSearch、Logstash和Kibana)整合构建应用服务监控系统。
  • 2、消息队列系统
  • kafka在短信服务中的应用

三、Kakfa数据消费过程?

消息队列和socket 消息队列和kafka的区别_消息队列和socket_06

三、Kafka发布-订阅和用户组的工作流程?

消息队列和socket 消息队列和kafka的区别_学习_07

消息队列和socket 消息队列和kafka的区别_学习_08

四、Zookeeper的作用

  • Zookeeper是一个分布式配置和同步服务
  • Kafka 在 Zookeeper 中存储基本元数据(如偏移量Offset、主题Topic)
  • 由于所有关键信息存储在 Zookeeper 中,并且它通常在其整体上复制此数据,因此Kafka代理/ Zookeeper 的故障不会影响 Kafka 集群的状态。

五、Kafka安装使用-Kafka docker安装

# 1, 安装Zookeeper kafka
docker pull wurstmeister/kafka
docker pull zookeeper

# 2.1, 启动Zookeeper
docker run -d --name zookeeper -p 2181:2181 -v /mnt/d/apps/kafkaData/zookeeper/data:/data -v /mnt/d/apps/kafkaData/zookeeper/log:/datalog zookeeper

# 2.2, 启动Kafka
# PS 172.27.107.133 是宿主机地址
docker run -d --name kafka --publish 9092:9092 \
--link zookeeper \
--env KAFKA_ZOOKEEPER_CONNECT=172.28.207.86:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=172.28.207.86 \
--env KAFKA_ADVERTISED_PORT=9092  \
--env KAFKA_LOG_DIRS=/kafka/kafka-logs-1 \
-v /mnt/d/apps/kafkaData/kafka/log:/kafka/kafka-logs-1  \
wurstmeister/kafka
# 3. CRUD Topic
# 创建 topic
docker exec kafka kafka-topics.sh --create --zookeeper   172.28.207.86:2181 --replication-factor 1 --partitions 1 --topic topic_gbc_order
# 查看 topic
docker exec kafka kafka-topics.sh --list --zookeeper   172.28.207.86:2181 
# docker exec -it kafka kafka-console-producer.sh --broker-list 192.168.60.133:9092 --topic test

# 4. CRUD 消费者Consumer和生产者
# 创建 生产者
docker exec -it kafka kafka-console-producer.sh --broker-list  172.28.207.86:9092 --topic topic_gbc_order
# 创建 消费者
docker exec -it kafka kafka-console-consumer.sh --bootstrap-server  172.28.207.86:9092 --topic topic_gbc_order --from-beginning
  • 通过Docker compose 创建 kafka和zookeeper
  • 启动命令 docker-compose up -d

compose.yaml

version: '3'

services:
 zookeeper:
   image: zookeeper # 镜像名称
   restart: unless-stopped
   ports:
     - "2181:2181"
   volumes:
     - /mnt/d/apps/kafkaData/zookeeper/data:/data # 数据文件夹挂载
     - /mnt/d/apps/kafkaData/zookeeper/log:/datalog # 日志文件夹挂载
   container_name: zookeeper # 容器名称

 kafka:
   image: wurstmeister/kafka # 镜像名称
   ports:
     - "9092:9092"
   environment:
     KAFKA_ADVERTISED_HOST_NAME: "172.27.107.133" # 宿主机地址
     KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
     KAFKA_LOG_DIRS: "/kafka/kafka-logs-1" # 日志路径
   volumes:
     - /mnt/d/apps/kafkaData/kafka/log:/kafka/kafka-logs-1 # 日志挂载
   depends_on:
     - zookeeper # 依赖镜像 
   container_name: kafka # 容器名称

六、Kafka的客户端有哪些?

  • Sarama: Shopify开源的Golang客户端
  • confluent-kafka-go是Confluent公司的开源的Golang客户端。

总结

  • Kafka是个好东西,希望你也能拥有