消息队列与Kafka
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的更多相关文章
- redis 的消息队列 VS kafka
redis push/pop VS pub/sub (1)push/pop每条消息只会有一个消费者消费,而pub/sub可以有多个 对于任务队列来说,push/pop足够,但真的在做分布式消息分发的时 ...
- 消息队列之 Kafka
转 https://www.jianshu.com/p/2c4caed49343 消息队列之 Kafka 预流 2018.01.15 16:27* 字数 3533 阅读 1114评论 0喜欢 12 K ...
- 【知识点】同样是消息队列,Kafka凭什么速度那么快?
同样是消息队列,Kafka凭什么速度那么快? 作者 | MrZhangxd Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafk ...
- Spring Cloud(7):事件驱动(Stream)分布式缓存(Redis)及消息队列(Kafka)
分布式缓存(Redis)及消息队列(Kafka) 设想一种情况,服务A频繁的调用服务B的数据,但是服务B的数据更新的并不频繁. 实际上,这种情况并不少见,大多数情况,用户的操作更多的是查询.如果我们缓 ...
- 用过消息队列?Kafka?能否手写一个消息队列?懵
是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...
- 【消息队列】kafka是如何保证消息不被重复消费的
一.kafka自带的消费机制 kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offs ...
- 【消息队列】kafka是如何保证高可用的
一.kafka一个最基本的架构认识 由多个broker组成,每个broker就是一个节点:创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的br ...
- 消息队列之Kafka——从架构技术重新理解Kafka
Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢? 我们知道流处理平台有以下三种特性: 可以让你发布和订阅流式的记录.这一方面与消息队列或者企业消息系统类似. 可以储存流式的 ...
- 01 . 消息队列之(Kafka+ZooKeeper)
消息队列简介 什么是消息队列? 首先,我们来看看什么是消息队列,维基百科里的解释翻译过来如下: 队列提供了一种异步通信协议,这意味着消息的发送者和接受者不需要同时与消息保持联系,发送者发送的消息会存储 ...
随机推荐
- WebApi中使用Ninject 依赖注入
之前Ninject依赖注入是在MVC中使用,最近在WebApi中使用,用之前的MVC方式发现使用接口注入,一直是Null错误,网上查询了一些资源,总结一下,以后备用. 主要分为以下几步骤: 在NuGe ...
- Sql万能分页代码
sql数据库中常用的分页 我做了一个万能的 用的上的小伙伴拿去耍吧 go ----万能分页代码create procedure [dbo].[sp_datapager] @pagesize int, ...
- 介绍Dynamics 365的OrgDBOrgSettings工具
摘要: 微软动态CRM专家罗勇 ,回复320或者20190320可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 有时候会需要 ...
- Canvas 绘图学习笔记2
1 绘制文本 fillText(string,x,y,maxWidth) //填充试绘制文本 strokeText(string,x,y,maxWidth) 画线试绘制文本 设置字体样式: cont ...
- Scrapy 框架流程详解
框架流程图 Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Respon ...
- Redis基础一(Linux)
Redis概述 1.是一个开源的,先进的<key,value>存储,并用与构建高性能,可扩展的应用程序的完美解决方案 2.从它的许多竞争继承来的三个主要特点: l Redis数据库完全在 ...
- cent os 7 与cent os 6 修改主机名称
centos6 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.零时修改用hostname your-name cnet ...
- 2 OpenWrt路由器系统开发与网页设计
https://www.zhongkerd.com/news/content-729.html 摘 要: 目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户 ...
- DOM中获取宽高、位置总结
原生JS 一.文档.窗口的宽高和位置 // 获取屏幕的宽高 window.screen.height | window.screen.width // 屏幕可用工作区宽高 window.screen. ...
- Codeforces Goodbye 2018
Goodbye 2018 可能是我太菜考试的时候出不了$E$ 可能是我太菜考试的时候调不出$F$ 所以转化为手速场之后手速还上不去.jpg A 模拟题意... #include <cstdio& ...