2019-04-09

关键词: 消息队列、为什么使用消息队列、消息队列的好处、消息队列的意义、Kafka是什么


本篇文章系本人就当前所掌握的知识关于 消息队列 与 kafka 知识点的一些简要介绍,不保证文章所述内容的绝对、完全正确性。

1、消息队列于消息系统的意义

笔者这里所提到的 消息系统 可不是那些社交网站上用于站内交流的消息系统。

在互联网中,但凡涉及到消息传递的过程,都可以称之为是一个消息系统,规模或大或小而已。举个例子:12306 购票过程就包含了消息系统,客户的查询、下单等请求都被封装成消息传递到服务器上并被处理。还有淘宝京东的购物流程,学校图书馆的借阅系统等等都涉及到消息系统。消息系统在互联网中的应用是非常广泛的。

在一个消息系统中,服务器端即 消息处理端 是至关重要的。且不管你配备什么配置的硬件,它的处理能力始终是有上限的。如果单位时间内消息产生的数量超过了服务器所能处理的数量,那我们的系统就肯定要出问题了。当然我们可以通过多部署几台服务器以分布式的方式来分摊消息压力来解决,但成本是个大问题啊。消息爆发的情况总是少数,你看淘宝一年就搞一次购物节,12306 一年也就那么几次抢票高峰期。因此,为我们的消息系统引入 消息队列 就是一个最佳选择了。

什么是消息队列呢?

我们可以简单地把它理解成是消息系统中 介于 客户端与服务端之间的一个 消息中转站 。消息队列在消息系统中主要有以下 3 个作用

1. 应用解耦

2. 流量削峰

3. 异步消息

应用解耦

相信你一定还记得软件设计的原则就是:高内聚,低耦合。 在没有引入消息队列模块时,应用模块之间通常都是直接进行消息传递过程的。我们以 12306 购票过程为例,用户购票下单的过程与车票库存直接相关。当用户下单购票时,会同时调用车票库存模块,使车票余量减少。这样就使得下单模块与车票库存模块存在强耦合关系。当车票库存模块服务不稳定时,例如,刚好要下单时库存模块就暂停服务了,这样一来就可能直接引发下单失败等一系列不良体验。而若加入了消息队列,下单请求将会直接发送到消息队列中暂存,待到车票库存模块恢复工作后再主动去消费下单请求。

流量削峰

这个就是前面提到的 “消息爆发” 的情况了,俗称 “流量爆发” 。这种情况常见于电商网站的秒杀活动里。在引入了消息队列以后,所有来自客户端的请求都被积压在消息队列里,任凭你产生了多大的瞬时流量,我服务器就按照我所能处理的速率按顺序来逐条消费这些请求。这样就可以保证我们的服务器在任何情况下都能正常服务,只是将这种流量爆增的代价转架到客户端头上使他们多排排队而已。

异步消息

这种情况主要是应用于请求需要等待反馈结果情况。当有一条请求被发起时,各响应模块对请求的处理也是需要时间的,若所依赖的模块再多一点,响应时延可能就会很长了。那我们知道:用户都是急躁的! 所以我们可以通过引入消息队列的方式来异步处理请求消息。一种常用的方式是,用户通过网页下达了一条指令,当后台接收到这条指令并将它压到消息队列时就立即返回 “成功” 的提示,随后再等待各模块去执行这一指令。这种方式可以大大提升用户体验。

消息队列真这么优秀吗?

前面介绍了这么多消息队列的好处,并且现在的互联网消息队列的使用也确实是非常广泛。但消息队列也是有缺点的,它最大的一个缺点就是会增加 “系统复杂度” 。对于一个系统来讲,模块越少越简单,运行起来出现故障的几率就越小,换句话说就是越容易稳定。而我们引入消息队列这一行为,至少是给我们的系统增加了一个模块,这必然会提升系统复杂度。另一个缺点是你不可避免要面对消息队列模块故障的问题。当消息队列模块故障了,你的整个消息系统也就瘫痪了。不过总体而言,引入消息队列还是弊大于利的。

2、Kafka 简介

消息队列框架还是不少的,不同的消息队列框架有各自不同的适用场景。在大数据领域里要数 Kafka 比较热门。

2.1、Kafka 是什么

Kafka 是由 LinkedIn 团队开发的一款 发布/订阅 模型的分布式流处理平台 ,主要用于对数据流的存储与处理。于 2012 年成为 apache 顶级项目之一。Kafka 既然被当作消息队列来使用,那么它的核心功能自然就是 高性能的消息发送与消费 了。同时 Kafka 还是一个依赖于 Zookeeper 的分布式消息队列。

2.2、什么是发布/订阅模型

发布/订阅模型可以简单理解为就是一种 “一对多” 的消息推送系统。消息的发送者不会直接将消息发给消息接收者。而是消息发送者首先以某种方式将消息分类,由消息接收者主动订阅某种分类下的消息。当这一操作完成后,有新消息到来时,消息发送者才会将新消息推送给所有订阅了该类型消息的接收者。

2.3、Kafka 的架构

1、

从消息流向角度来看,Kafka 中共有 3 个角色

1. producer

2. topic

3. consumer

producer

即消息的生产者。

topic

消息的分类。在 Kafka 中,不同类型的消息以 topic 划分。例如在某电商网站中,下单消息被划为一个 topic ,取消订单被划分为另一个 topic 等等。在某种程度上也可以将 topic 理解为是一个 队列 。所有的消息都是以先进先出的形式被保存在一个 topic 中的。

consumer

即消息的消费者。

2、

从消息管理的角度来看,可以分为 3 个角色

1. topic

2. partition

3. replication

topic

上面已经有解释。

partition

如果一个 topic 规模过大,则可以将它拆分成多个 partition 以存储在不同的节点上。可以理解为 topic 是由 1 ~ n 个 partition 组成的。

replication

replication 即是 partition 的副本。它是为了提高 topic 的可用性而设立的一个角色。其意义与 HDFS 中的副本是一样的。

值得一提的是,对于同一个 topic 中的多个 partition 副本中,会有其中一个 partition 副本是 leader 副本,其余的是 follower 副本。消费者只与 leader 副本交互。

3、

从集群的角度看,可以分成 2 种角色

1. broker

2. cluster

broker

通常一台 kafka 服务器就是一个 broker ,而一个 broker 里又可以包含多个 topic 。

cluster

多台 broker 构成一个 Kafka 集群。

4、

从消费者的角度看,可以分为 2 类

1. consumer

2. consumer group

consumer

消费者。

consumer group

消费者组。多个消费者可以划分到一个消费者组里。若某个消费者组订阅了某个 topic ,则有新消息到来时,只会发送给这个消费者组中的一个消费者而不是发给所有消费者。

5、

综上所述,可以作出如下图所示的 Kafka 架构图

kafka 架构简图


2019-04-09

消息队列与Kafka的更多相关文章

  1. redis 的消息队列 VS kafka

    redis push/pop VS pub/sub (1)push/pop每条消息只会有一个消费者消费,而pub/sub可以有多个 对于任务队列来说,push/pop足够,但真的在做分布式消息分发的时 ...

  2. 消息队列之 Kafka

    转 https://www.jianshu.com/p/2c4caed49343 消息队列之 Kafka 预流 2018.01.15 16:27* 字数 3533 阅读 1114评论 0喜欢 12 K ...

  3. 【知识点】同样是消息队列,Kafka凭什么速度那么快?

    同样是消息队列,Kafka凭什么速度那么快? 作者 | MrZhangxd Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafk ...

  4. Spring Cloud(7):事件驱动(Stream)分布式缓存(Redis)及消息队列(Kafka)

    分布式缓存(Redis)及消息队列(Kafka) 设想一种情况,服务A频繁的调用服务B的数据,但是服务B的数据更新的并不频繁. 实际上,这种情况并不少见,大多数情况,用户的操作更多的是查询.如果我们缓 ...

  5. 用过消息队列?Kafka?能否手写一个消息队列?懵

    是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...

  6. 【消息队列】kafka是如何保证消息不被重复消费的

    一.kafka自带的消费机制 kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offs ...

  7. 【消息队列】kafka是如何保证高可用的

    一.kafka一个最基本的架构认识 由多个broker组成,每个broker就是一个节点:创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的br ...

  8. 消息队列之Kafka——从架构技术重新理解Kafka

    Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢? 我们知道流处理平台有以下三种特性: 可以让你发布和订阅流式的记录.这一方面与消息队列或者企业消息系统类似. 可以储存流式的 ...

  9. 01 . 消息队列之(Kafka+ZooKeeper)

    消息队列简介 什么是消息队列? 首先,我们来看看什么是消息队列,维基百科里的解释翻译过来如下: 队列提供了一种异步通信协议,这意味着消息的发送者和接受者不需要同时与消息保持联系,发送者发送的消息会存储 ...

随机推荐

  1. GraphQL学习过程应该是这样的

    记录一个从枯燥学习 GraphQL 的过程,到发现项目 Gitter,模仿项目 Github-Trending-API,最后做一个自己的学习项目 Github-Trending-GraphQL. 一开 ...

  2. centos7+rsyslog+loganalyzer+mysql 搭建rsyslog日志服务器

    一.简介 在centos7系统中,默认的日志系统是rsyslog,它是一类unix系统上使用的开源工具,用于在ip网络中转发日志信息,rsyslog采用模块化设计,是syslog的替代品. 1.rsy ...

  3. 文件输入输出流工具: IOUtils使用总结

    序言 以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便.下面就结合源码,看看IOUTil ...

  4. Css-移动端适配总结

    前言 工作以后,大部分的业务工作都是基于移动端H5的,开发过程中学习了很多东西,遇到过许多问题,诸如rem\em\css px\device px等,本文纯属个人的归纳总结,如有问题,请指出亲喷~ P ...

  5. Autofac 和 Quartz.Net 自动注入的整合

    一:问题场景 在一次项目开发中,项目中已使用了Autofac.在新需求中要用到Quatrz.Net.在任务中使用注入方法,确始终无法使用注入的方法,经过千百次的度娘,终于找到了解决办法!吐槽下度娘真心 ...

  6. Redis的值value(数据结构类型)

    Redis的数据结构类型,指的是redis的值的value类型: Redis的常用数据结构类型:string,list,set,sortedSet,hash 一.sting的类型 string类型是r ...

  7. 《JavaScript高级程序设计》笔记:DOM2和DOM3(十二)

    DOM1级主要定义的是HTML和XML文档的底层结构.DOM2级和DOM3级在这个结构基础上引入了更多的交互能力,也支持更高级的XML特性.为此DOM2级和DOM3级分为了很多的模块(模块直接具有某种 ...

  8. Sharepoint 2013搜索服务配置总结(实战)

    分享人:广州华软 星尘 一. 前言 SharePoint 2013集成了Fast搜索,相对于以前版本搜索的配置有了一些改变,在安装部署Sharepoint 2013时可以选择默认创建搜索服务,但有时候 ...

  9. 荣耀7.0系统手机最简单激活Xposed框架的步骤

    对于喜欢玩手机的小伙伴来说,很多时候会使用到Xposed框架及各类功能彪悍的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活Xposed框架是比较简便的,但随着系统版本的不断更新 ...

  10. 西湖论剑2019复现-Web之首家线上赌场上线啦

    首页打开 经过测试发现name和code参数可控,但尝试注入没有发现注入点,于是直接扫描目录找思路 一扫描,果然有问题 目录扫描里面可以看到有一个/.DS_Store的文件,DS_Store是Mac ...