摘要

在本文中,我将从为什么需要消息队列开始讲起,举两个小例子,跟你聊聊目前消息队列的一些使用场景。

比如消息队列在复杂系统中的解耦,又比如消息队列在高并发下的场景如果让流量变得更平缓。

随后我会跟你介绍一下Kafka中的一些重要的名词,比如主题、Broker、分区等。

注意,Kafka不仅仅是消息中间件,他还是优秀的分布式流处理平台,不过在本文中重点还是研究Kafka在消息队列中的应用,以及原理。

1. 使用场景

在我们学习Kafka之前,先想一想什么地方需要用到消息中间件。

然后,我将举两个小例子,简单的说一说消息中间件的使用场景。

1.1 解耦

比如我们在一个系统中,需要调用其他的很多个系统,我们当然可以在这个系统中挨个调用其他的系统。但是问题就来了,如果我们需要调用的其他系统有变动,比如增加了新的系统,或者有一些系统不再提供服务了,那么应该怎么办呢?修改系统调用的代码,然后再次上线?

这样显得特别的麻烦,而且也使得这个系统与其他的系统完完全全的耦合在了一起。

所以我们可以把我们的”服务调用“,封装成一个消息,发送到消息中间件上。

对于其他的系统,只需要去这个消息中间件上面拉取自己需要的消息,然后进行处理。

此外,对于用户来说,也不需要等待这么长的时间,只要这个系统将消息丢进了消息中间件就可以返回了,这就保证了更快的响应速度。

这就是我们所说的解耦,一个系统只管把数据发送到中间件中,另外的系统只管从中间件中拿到数据,然后处理。

1.2 削峰填谷

一开口就知道老高并发了。

这个名词我们其实并不陌生,但凡你搜过”高并发“、”秒杀”这一类的关键词,就一定会查到这样的结果。

那么削峰填谷的关键就在于让流量变得更加的平缓。

咱们就拿“秒杀”举例。

那么对于这个商城来讲,这个“秒杀”活动的上游服务就是下单。而这个上游服务需要调用很多的下游服务,比如库存服务生成库存,订单服务生成订单,支付服务,而支付服务又可能需要调用第三方的支付接口等等。简单来讲,就是上游服务的处理速度远远大于下游服务的处理速度。

那么这个时候如果我们不对上游服务做任何的限制,所有的请求直接打到下游服务,那么整个系统都可能挂掉。

所以,我们可以用消息中间件来做“削峰填谷”这件事情。

上游服务只需要将“某某用户在某某时间购买了某某商品”等这些必要的信息,丢进消息中间件中,然后下游服务按照自己的速度,从消息中间件中拉取信息,然后消费。这样,整个系统的处理就能有条不紊了。

在这里,我只是举了一些小例子,省略了很多细节,真正的业务并没有这么简单,还有很多东西是需要考虑的,比如我们把消息放进了消息中间件中,什么时候才能被消费呢,会不会一直饥饿,这个时候需不需要再次发送信息呢?

再比如,如果我再次发送了信息,有没有可能重复消费呢?

又或者,我们发送的信息有没有可能丢了?

诸如此类的问题其实还有很多,我们带着这些问题往下看。

2. 概念

说完了消息队列的用途,我准备跟你介绍一下在Kafka中的几个常见的名词。

但是有一点是需要注意的,虽然在本篇,甚至本系列的文章中,我可能都在讲消息队列这个概念,但是Kafka不仅仅只是个消息引擎系统,他还是一个很优秀的分布式流处理平台

只不过作者能力学识都有限,所以目前只能先研究消息队列这个方面的内容。

2.1 生产者与消费者

这个很容易理解,生产者就是发送消息的对象。

生产者负责把需要处理的消息或者记录,发送到消息队列中,剩下的事情就与他无关了。

消费者是处理消息的对象。

消费者负责从消息队列中拉取待处理的消息,然后进行处理。

2.2 主题

在上面的内容中,我只说到了“把消息丢到消息队列”以及“从消息队列中拉取消息”这么两种说法,那么现在我们要解决的问题是:

  • 怎么确定我该把消息发送到哪/我该从哪里拿消息?

  • 如果有不同种类的消费者,会不会把消息搞混?

其实如果只有一种消息,那么是不会有这个问题的。但是如果有不同种类的消息呢,比如我有下单的消息,也有日志的消息,那么会不会存在订单服务拿到了日志消息这种情况呢?难道我应该配置多个Kafka吗?

所以在Kafka中有了主题这种说法。

在解释原理之前,你可以这么理解,一个主题,对应一个队列。我们在发送消息的时候,选择合适的主题,将消息发送到这个主题中。

生产者将消息发送到设定好的主题中,消费者负责从特定的主题拉取消息,然后进行处理。

如此一来,我们的消息队列就可以处理更多种类的消息了。

2.3 Broker

上面我们提到了生产者与消费者,他们被称为Kafka的客户端。

既然有客户端,那么就一定有服务端,就是我们这一小节提到的Broker

Broker相当于Kafka的服务端,你可以理解为是队列存在的地方,生产者把消息发送到Broker中,消费者从Broker中获取消息。

2.4 分区

在上面我们提到了,在Broker中有好几个主题,生产者向Broker中的某一个主题发送信息,消费者从Broker中的某一个主题拉取信息。

那么我们很容易的可以发现,这个消息队列是存在性能瓶颈的。

在这里,Broker所在的机器的IO速度,可能会使得这个消息队列存在性能上的瓶颈。

假设我们的Broker上面有特别多的主题,那么这个时候如果由于IO速度不够,可能会导致生产者无法及时的将消息发送到Broker中,消费者无法及时的从Broker中拉取消息。

所以就有了分区这个概念,相当于我们可以把一个主题分成很多份。但是,当生产者往某一个主题中发送消息的时候,并不会把这个消息发送给这个主题的所有分区,而是会发送到这个主题的某一个分区下。

也就是说,这里的分区,是扩展的概念,而不是复制的概念。

此外,这些分区可以部署在不同的机器上,性能也就提升了好几倍。

2.5 Replica

“高可用”这个概念,在互联网中也特别的重要。

而通常来讲,可用性通常都是通过冗余来实现的。

上面我们提到了分区这个概念,利用分区,把一个主题分成多个部分进行扩展。

但是如果某一个分区挂了,是不是就这个主题的很多信息就丢失了呢?

因此有了Replica这个概念。简单的来说,就是把每一个分区,都复制几份。

通常来讲,我们理解的复制,都是有一个leader,若干个follower,且一般leader负责写,follower负责读。不过在Kafka中跟MySQL这些不太一样,在Kafka中follower就仅仅只是作备份使用,所有的读写还是发生在了leader身上。

写在最后

首先,谢谢你能看到这里。

在《Kafka入门》系列的文章中,我的打算是跟MySQL系列的文章一样,尽可能的把复杂的概念讲得更加简单易懂一些。另外,也会稍微的深入一点点原理,尽可能的在会用的情况下,知道他是怎么实现的,以及为什么要这么设计。

在这期间我如果有哪些理解的不够到位,或者解释的不对,欢迎留言指正!

再次感谢你能看到这里!

PS:如果有其他的问题,也可以在公众号找到我,欢迎来找我玩~

Kafka入门(1):概述的更多相关文章

  1. Kafka 入门和 Spring Boot 集成

    目录 Kafka 入门和 Spring Boot 集成 标签:博客 概述 应用场景 基本概念 基本结构 和Spring Boot 集成 集成概述 集成环境 kafka 环境搭建 Spring Boot ...

  2. 《OD大数据实战》Kafka入门实例

    官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...

  3. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

  4. kafka 入门笔记 #1

    kafka 入门笔记(#1) 单机测试 下载版本,解压 tar -xzf kafka_2.11-0.10.1.1.tgz cd kafka_2.11-0.10.1.1 启动服务 Kafka用到了Zoo ...

  5. Kafka入门介绍

    1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...

  6. Kafka入门 --安装和简单实用

    一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...

  7. Redis(一):NoSQL入门和概述

    NoSQL入门和概述目录导航: NoSQL入门概述 3V+3高 当下的NoSQL经典应用 NoSQL数据模型简介 NoSQL数据库的四大分类 在分布式数据库中CAP原理CAP+BASE NoSQL 入 ...

  8. 转 Kafka入门经典教程

    Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...

  9. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

随机推荐

  1. 我去,你竟然还不会用 Java final 关键字

    写一篇文章容易吗?太不容易了,首先,需要一个安静的环境,这一点就非常不容易.很多小伙伴的办公室都是开放式的,非常吵,况且上班时间写的话,领导就不高兴了:只能抽时间写.其次,环境有了,还要有一颗安静的心 ...

  2. nodejs如何从异步回调函数返回想要的值

    const fs = require('fs') let read=()=>{ fs.readFile("./contents/test.json",(err,data)=& ...

  3. TCP 重置攻击的工作原理

    原文链接:https://fuckcloudnative.io/posts/deploy-k3s-cross-public-cloud/ TCP 重置攻击 是使用一个单一的数据包来执行的,只有几个字节 ...

  4. 深入理解Java虚拟机学习笔记(一)-----Java内存区域

    一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...

  5. STM32单片机应用与全案例实践 /stm32自学笔记 第二版 pdf

    STM32单片机应用与全案例实践pdf https://pan.baidu.com/s/16WrivuLcHvLTwS__Zcwl6Q 4rj3 stm32自学笔记 第二版 pdf https://p ...

  6. arduino连接12864LCD方法

    arduino连接12864LCD方法,参考相关代码. https://blog.csdn.net/txwtech/article/details/95038386

  7. Beta冲刺--冲刺总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 Beta冲刺--冲刺总结 作业正文 如下 其他参考文献 ... Beta冲刺 ...

  8. springboot + rabbitmq 做智能家居,我也没想到会这么简单

    本文收录在个人博客:www.chengxy-nds.top,共享技术资源,共同进步 前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇 ...

  9. VMware Workstation 15密钥

    在打开的VMware Workstation 15输入许可证密钥对话框里直接输入25位密钥,然后点击确定,如下图所示. 这里提供一个密钥: CG392-4PX5J-H816Z-HYZNG-PQRG2

  10. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...