0
点赞
收藏
分享

微信扫一扫

消息队列:基础概念篇

巧乐兹_d41f 2022-01-21 阅读 59

前言

接下来我在写一些技术类科普的文章,大致会以who(它是谁)、why(为什么)、how(怎么做)的写作方向来向大家介绍说明,因为我认为这样子介绍说明思路会比较明确,也能够更快学会一项新技能,个人拙见,写得不好、不对的地方,还望大家赐教。

Who|什么是消息队列(MQ)

简单来说,就是排队的意思,先进先出。

Why|为什么用MQ

查个题外话,我认为使用一项新技术的时候,我们要综合考虑该技术的利弊性、维护性、成本性,而不是盲目跟随主流,自己的业务产品不管三七二十一都使用最新的技术,也得根据项目的实际情况来最终决定。

回归主题,存在即合理,它的主要的三大应用场景:应用解耦、异步消息、流量削峰,除此之外,还有延迟通知、分布式事务、顺序消息、流式处理等等。下面我主要细说下它的三大应用场景。

应用解耦

举个例子,有个业务场景,我有三个系统,分别是A、B、C系统,大致业务是,A系统操作完具体业务,会分别调用B跟C的接口。

传统做法

在这里插入图片描述

可能存在问题:

因此根据以上几点,我们可以明显看出应用系统之间的耦合度很高,没有很独立的思想,所以就需要引用MQ来作为中间件来降低它们之间的耦合度。

MQ做法

在这里插入图片描述

由此可见,这样子A系统是不是很独立了,压根就不需要管BCD系统会出现什么异常情况,A系统的代码也不再需要重新维护。

异步处理

举个例子,有个预约挂号的业务,病人挂号成功后,需要发送短信通知跟微信通知

传统做法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AfpiJsvW-1642755230477)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220121144534818.png)]

MQ做法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-44PXNAi3-1642755230481)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220121152801920.png)]

流量削峰

举个例子,A系统每天都风平浪静的,每秒平均的并发量也才50个,但是有一天,在某个时间段,突然每秒的并发请求量激增到6K+,假如该系统的数据库是用mysql,每秒执行6K+条的SQL。正常的mysql数据库能够抗住每秒2k条的执行语句,一下子到6k+,会直接导致数据库崩溃,从而导致系统也崩溃了。

传统做法

在这里插入图片描述

MQ做法

在这里插入图片描述

MQ有什么优缺点

东西都是有两面性的。优点就不用说了吧,就是上面说的那些,下面我们来说说有哪些缺点跟需要考虑的问题

  • 系统可⽤性降低

系统引⼊的外部依赖越多,越容易挂掉。本来 A 系统调⽤ BCD 三个系统的接⼝就好了,没啥问题,但偏偏加个 MQ 进来,万⼀ MQ 挂了咋整,MQ ⼀挂,不仅整套系统崩溃的,你也就崩溃?所以要保证消息队列的⾼可⽤

  • 系统复杂度提⾼

硬⽣⽣加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?

  • ⼀致性问题

A 系统处理完了直接返回成功了,都以为这个请求就成功了;但是问题是,要是 BCD三个系统中,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?这时候数据就不⼀致了。

总结一下:

  • 如何保证消息的高可用

  • 如何保证消息消费的幂等性

  • 如何处理消息丢失问题

  • 如何保证消息的顺序性

  • 如何解决消息积压

  • 如何保持数据一致性

How|怎么用MQ

目前市场常见的消息队列产品主要有ActiveMQ、RabbitMQ、RocketMQ、Kafka等。

那么怎么选择一款符合自己产品的MQ就很关键了。下面有个对比分享做参考。

特性ActiveMQRabbitMQRocketMQKafka
开发语言JavaErlangJavaScala&Java
客户端支持语言Java、C、C++、Python、PHP、Pert、.net等几乎支持所有常用语言Java、C++官方支持Java,但是开源社区有常用语言版本
单机吞吐量万级,比 RocketMQ、Kafka 低一个数量级同 ActiveMQ10 万级,支撑高吞吐10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topictopic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性ms 级微秒级,这是 RabbitMQ 的一大特点,延迟最低ms 级延迟在 ms 级以内
可用性高,基于主从架构实现高可用同 ActiveMQ非常高,分布式架构非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性有较低的概率丢失数据基本不丢经过参数优化配置,可以做到 0 丢失同 RocketMQ
功能支持MQ 领域的功能极其完备基于 erlang 开发,并发能力很强,性能极好,延时很低MQ 功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

综上,各种对比之后,有如下建议:

  • ActiveMQ最为老牌MQ,现在用的人不多,社区也不太活跃,所有不推荐
  • 中小企业,并发量不是很大的,追求稳定,RabbitMQ是首选
  • Java首选RocketMQ,毕竟阿里出品,向大厂看齐
  • 大数据领域的用 Kafka 是业内标准的,社区活跃度很高
举报

相关推荐

0 条评论