专栏首页发哥说消息队列CKafka系列学习文章 - 什么是消息队列 ?(一)
原创

CKafka系列学习文章 - 什么是消息队列 ?(一)

| 导语 在大家的工作当中,是否碰到大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Many Connections)错误,遇到这样的清况?你又是如何处理?

接下来要介绍一下消息队列:

1,什么是消息队列?

2,为什么要用消息队列?

3,消息队列有那些作用?

4,市面上又有那些消息队列可以用?

一、什么是消息队列

“消息队列”(Message Queue,MQ)从字面来理解,是一个队列,拥有先进先出(First Input First Output,FIFO)的特性。它主要用于不同进程或线程之间的通信,用来处理一系列的输入请求。

消息队列采用异步通信机制。即消息的发送者和接收者无须同时与消息队列进行数据交互,消息会一直保存在队列中,直至被接收者读取。每一条消息记录都包含详细的数据说明,包括数据产生的时间、数据类型、特定的输入参数。

二、为什么要用消息队列

当你的客户量一下暴涨时,像前几年大家一起抢购小米手机时,像这种高并发的场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。例如:大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Many Connections)的错误,相信大家在工作当中都有碰到过。

因此,在这种高并发的应用场景中需要一个缓冲机制,而消息队列则可以很好的充当这样一个角色。消息队列通过异步处理请求来缓解系统的压力。

三、消息队列有那些作用

消息队列除了可以通过异步处理请求来缓解下游系统的压力,还有以下作用:

1、应用解耦

例如:在人脸识别的场景中,客户端拍到用户的照片,并通过网络上传到服务端。

人脸识别的场景

(1)图片上传系统将图片信息(唯一ID、图片类型、图片大小等)批量写入消息队列,写入成功后会将结果直接返回级客户端。

(2)人脸识别系统定时从消息队列中读取数据,完成对新增图片的识别。

图片上传系统无须关心人脸识别系统是否对上传的图片进行了处理,它只需要关心是否成功将图片信息写入消息队列。由于用户也无须立即知晓人脸识别的结果,因此人脸识别系统可选择不同的调度策略来处理消息队列中的图片信息。这样就实现了图 片上传系统与人脸识别系统之间的解耦。

2、异步处理

在之前我们实现用户注册账号时,服务程序需要给用户发送邮件注册信息和短息注册信息。我们常用的做法是:串行方式和并行方式。

(1)串行方式

服务程序先注册信息写入数据库,然后发送短信注册信息,再发送邮件注册信息,三个任务都完成了才会响应用户。如果每个任务需要20s,那一共需要60s。

串行方式

(2)并行方式

服务程序先注册信息写入数据库,然后同时发送短信注册信息和邮件注册信息,三个任务都完成了才会响应用户。如果每个任务需要20s,那一共需要40s。

并行方式

采用上面两种方式,当用户量增加时,系统的性能(如并发量、吞吐量、响应时间)分产生瓶颈。此时需要引用消息队列异步处理非必要业务环节。如下图:

(3)异步处理

服务程序先注册信息写入数据库,短信注册信息和邮件注册信息写入消息队列后会直接将结果返回给用户。

由于写入消息队列的速度非常快,基本可以忽略。另外”通过异步读取消息队列中的短信注册信息”过程和发送邮件过程相当于同时进行的,那么整个过程约耗时20s。

异步处理

异步处理的方式即没有串行和并行可能会遇到的瓶颈,业务处理过程也更快。

3,数据限流

数据限流也是消息队列的常用场景之一,一般在促销和“秒杀”活动中使用得较为广泛。

例如:在电商的“双11”活动中,由于瞬间的数据访问量过大,服务器接收到的数据请求过大,则导致服务器上的应用服务无法处理请求而崩溃。

为了解决这类问题,一般需要先将用户请求写入消息队列(相当于用消息队列做一个缓冲),然后服务器上的应用服务再从消息队列中读取数据。

数据限流

数据限流具有以下优点:

  • 用户请求写数据到消息队列时,不与应用服务直接接触,中间存在一次缓冲。这极大地减少了应用服务处理用户请求的压力。
  • 可以设置队列长度,用户请求遵循FIFO(先进先出)的原则。

4,消息通信

消息队列具有高效的通信机制,所以其在点对点通信和聊天室通信中被广泛应用。具体流程如下:

点对点通信和聊天室通信

四,市面上又有那些消息队列

各大云厂商的消息队列和开源消息队列:

云厂商

开源消息队列

硬件消息队列

腾讯云Kafka 腾讯云CMQ 阿里云MQ AWS Kinesis 百度Kafka Ucloud UKafka等

Apache Kafka RabbitMQ RocketMQ ActiveMQ ZeroMQ等

Solace等

下一章将对比RabbitMQ、RocketMQ、CMQ、kafka和Ckafka(二)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CKafka系列学习文章 - 对比RabbitMQ、RocketMQ、CMQ、kafka和Ckafka(二)

    导语:上一章我们聊到了:什么是消息队列,为什么要用消息队列,有那些消息队列?下来我们聊聊什么样的消息队列适合我们公司。

    发哥说消息队列
  • CKafka系列学习文章 - 用java实现API调用(十一)

    导语:上一章节我们了解了怎么手动拼接请求URL和用API2.0签名自动生成请求URL,来调用CKafka的接口,这一章将进入开发阶段,用java实现拼接请求UR...

    发哥说消息队列
  • CKafka系列学习文章 - CKafka入门型配置压测报告(十五)

    CKafka实例: 规格:入门型、峰值带宽: 40 MB/s、磁盘容量: 300GB,

    发哥说消息队列
  • IBM MQ运维使用手册

    操作系统版本:SUSE Linux Enterprise Server 10 SP4    32bit

    loong576
  • Java队列学习第一篇之列介绍

    队列大家都知道,但是在Java中队列分哪几种呢?清楚吗?都有哪些地方用到了队列呢?最常用的场景的就是消息中间件,比如各种MQ都是使用的队列来的。如果没有用过消息...

    凯哥Java
  • 三分钟基础:什么是队列?

    像线程池、异步队列、消息队列等有限的资源容器中,往往存储大量的任务事件,这些大量的任务事件需要进行有条理的进行任务分发以及各种情况处理,为了能够使得资源容器的正...

    帅地
  • 前端中的数据结构——队列篇

    队列是数据结构中的一种,它与实际生活中的排队相似:在一条队伍中,先来的人总是能够先得到服务,后来的人只能排在队伍末尾等候。队列也是一样,它符合先进先出 FIFO...

    企鹅号小编
  • 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)

    数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用。因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队...

    lizelu
  • Hadoop FairScheduler

    本文档描述FairScheduler,一个允许YARN应用程序公平共享集群资源的调度插件。

    用户1217611
  • AI_第一部分 数据结构与算法(8.队列)

    第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果:

    还是牛6504957

扫码关注云+社区

领取腾讯云代金券