摘要

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

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

随后我会跟你介绍一下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. Ubuntu18.04美化MacOS(新更grub界面美化)

    写在前面的话: 在美化过程中大多数资源来自境外网站,下载时速度特别慢,写这篇博客一是为了给读者看,也是为了自己保存资源并记录ubuntu18.04的使用,避免你们或是自己以后再花费大量时间去百度方法和 ...

  2. 解决GITLAB无法启动runsv no running

    可以先尝试用 systemctl start gitlab-runsvdir.service 如果冻结不动的话,就需要查看系统服务项了 systemctl -t target 如果系统正常的话,所有任 ...

  3. 一个老牌程序员说:做Java开发,怎么可以不会这 20 种类库和 API

  4. Beta冲刺测试随笔

    测试工作安排 人员安排: 余文锦,孙劼成,陈富杰,明锐,王彦杰,陈康杰:测试 杨铭海,张鑫宇测试用例的编写 测试工具选择和运用 本来计划Beta冲刺挑选人员进行测试相关的接触和学习并胜任测试工作,但是 ...

  5. Win10搭建VM12.0.1虚拟机,虚拟机网络同宿主机ping不通的解决办法

    准备系统学习Linux系统,在电脑搭建了一个CentOS虚拟机,希望能从宿主机连接至虚拟机. 尝试了很多办法,碰到各种坑,最后这个方法成功了! 分享给大家,希望有所帮助. 一.环境 1.宿主机:Win ...

  6. Python-17-作用域

    python有一个名为vars的内置函数,它返回变量关联的不可见的字典: >>> x = 1  >>> scope = vars()  >>> s ...

  7. skywalking中文文档

    https://github.com/apache/skywalking/blob/v5.0.0-alpha/docs/README_ZH.md 大家可以前往如下地址下载我们的发布包: l  Apac ...

  8. Redis SDS 深入一点,看到更多!

    1.什么是SDS? Redis 自定的字符串存储结构,关于redis,你需要了解的几点!中我们对此有过简要说明. Redis 底层是用C语言编写的,可是在字符存储上,并未使用C原生的String类型, ...

  9. VulnHub PowerGrid 1.0.1靶机渗透

    ​本文首发于微信公众号:VulnHub PowerGrid 1.0.1靶机渗透,未经授权,禁止转载. 难度评级:☆☆☆☆☆官网地址:https://download.vulnhub.com/power ...

  10. Executors框架之ScheduledExecutorService实现定时任务

    一.简介 An ExecutorService that can schedule commands to run after a given delay, or to execute periodi ...