您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

应对流量高峰的利器——消息中间件

时间:2023-10-16 11:39:16  来源:微信公众号  作者:xin猿意码

一、引言

周末和朋友一起自驾去海边玩,去过杨梅坑的应该都知道,从杨梅坑到鹿嘴山庄需要坐快艇过去。

不愧是深圳游玩景点上稳居 TOP5 的地方,下午四五点的时候排队坐艇的人还是非常多,买好票后我们被叫到一个岸边阶梯上等待上船,现场略微有些混乱。

人流量有点大,到站载客的船却不是很多。

就在我为维持秩序的工作人员捏一般汗时,我看到他们来来回回点了好几拨人,让这些人有序上船。

不多会儿,便有一个瘦黑的中年人来叫我们,说一条船只能装 10 个人,就点了我们前面的 10 个人,让其他人原地不动,点到的 10 个人可以上船。

果然,软件设计都来源于生活,此情此景,不就是系统设计里面经典的数据消费问题嘛!

二、消息中间件

当数据量(乘客)过多,系统(载客的快艇)来不及立刻消费时,会把数据先放到一个消费队列里(岸边阶梯)等待,起到一个流量削峰的作用。

在分布式系统里面,实现消费队列的一种主要方式就是采用消息中间件。

什么是消息中间件

消息中间件(Message Broker)是一种在分布式系统中用于传递消息、通知和事件的基础架构组件。

应对流量高峰的利器——消息中间件

它允许不同组件、应用程序或系统之间异步地交换数据和信息,以实现削峰、解耦和可扩展的通信。

消息中间件的基本原理包括以下几个关键概念:

  • 消息生产者(Producer): 这是消息的发送方,通常是一个应用程序或组件,它将消息发送到消息中间件。
  • 消息消费者(Consumer): 这是消息的接收方,通常也是一个应用程序或组件,它从消息中间件中接收和处理消息。
  • 消息队列(Message Queue): 这是消息中间件的核心组件,它是一个存储消息的队列,消息生产者将消息放入队列,消息消费者从队列中获取消息。消息队列通常采用先进先出(FIFO)的原则。
  • 消息主题(Topic): 除了消息队列,消息中间件还支持消息主题,它允许发布-订阅模式的消息通信。消息发布者将消息发布到主题,而订阅者可以订阅特定主题以接收相关消息。

消息中间件的优点包括:

  • 解耦性: 消息中间件允许生产者和消费者独立操作,它们不需要直接知道对方的存在。这种解耦性使系统更加灵活和可维护。
  • 可扩展性: 通过增加消息中间件的容量,可以轻松应对更多的消息流量和消费者。
  • 异步通信: 消息中间件允许异步通信,生产者可以继续工作而不必等待消息被处理,从而提高系统的性能和响应速度。
  • 消息持久性: 消息通常会被持久化,即使消息中间件或消费者出现故障,消息也不会丢失。

消息中间件有许多不同的实现和协议,其中一些流行的消息中间件包括 ActiveMQ、RocketMQ、RabbitMQ、Kafka 等。

应对流量高峰的利器——消息中间件

它们在不同的使用场景和需求下有不同的特点和优势。

消息中间件在各种应用中广泛使用,包括微服务架构、大数据处理、实时数据分析、日志收集、事件驱动架构等。

接下来我们分别介绍常见的消息中间件以及它们的优缺点和适用场景,帮助大家在应用开发中作出明智的选择。

三、ActiveMQ

特点:

  • ActiveMQ 是一个基于 JAVA 的开源消息中间件,实现了 JMS(Java Message Service)规范。
  • 支持多种消息传递模型,包括点对点和发布-订阅。
  • 提供高可用性和负载均衡,支持主从复制,可用于构建高可用性系统。
  • 适用于 Java 应用程序,但也有一些支持其他编程语言的客户端。

优点:

  • 简单易用,适合快速开发和原型构建。
  • 集成了 Spring 框架,可以轻松与 Spring 应用集成。
  • 适用于中小型系统和企业内部通信。

缺点:

  • 性能相对较低,不适合高吞吐量和延迟要求较高的场景。
  • 不支持大规模的消息流,不适合大数据和实时分析应用。

适用场景: ActiveMQ 适用于需要简单的消息传递和中小型系统的内部通信。它在企业内部通信和轻量级应用中表现良好,但不适合高性能、高吞吐量和大规模数据处理。

总的来说,ActiveMQ 国内互联网公司落地较少,多是传统企业在使用。

四、RocketMQ

特点:

  • RocketMQ 是阿里巴巴早些年开源的 MQ 框架,基于 Java 语言写的,后来捐给了Apache,是一款快速、可靠、可扩展的分布式消息中间件。
  • 支持发布-订阅和点对点消息传递模型。
  • 具有高性能、低延迟的特点,适用于大规模的消息传递。
  • 支持丰富的客户端语言,包括 Java、C++、Python/ target=_blank class=infotextkey>Python、Go 等。

优点:

  • 高性能和低延迟,适用于高吞吐量的大规模应用。
  • 支持多种消息传递模型,适用于不同的业务场景。
  • 具有强大的监控和管理工具。

缺点:

  • 部署和配置相对复杂,需要一些专业知识。
  • 社区相对较小,相比一些其他消息中间件,文档和生态系统相对不够成熟。

适用场景: RocketMQ 适用于需要高性能、低延迟、可扩展性的大规模应用,如电商平台、金融系统、物联网应用等。

五、RabbitMQ

特点:

  • RabbitMQ 是一款开源的消息中间件,实现了 AMQP(高级消息队列协议)规范。
  • 支持广泛的消息传递模型,包括点对点、发布-订阅和 RPC。
  • 提供可靠性消息传递,支持事务和消息确认。
  • 有多种客户端库,支持多种编程语言。

优点:

  • 成熟的技术,稳定性高,广泛用于企业级应用。
  • 提供高可用性和负载均衡机制。
  • 支持多种编程语言,适用于跨语言的应用。

缺点:

  • 性能相对较低,不适合高吞吐量的大规模应用。
  • 部署和配置复杂,需要一些学习成本。
  • 自身是 erlang 语言开发,源码比较难分析,需要扎实的 erlang 语言功底。

适用场景: RabbitMQ 适用于企业级应用,需要可靠性和事务支持的场景,但对性能要求不是特别高的应用。

六、Kafka

特点:

  • Kafka 是一款高吞吐量、低延迟的分布式消息中间件,适用于大规模数据处理和实时流处理。
  • 主要用于发布-订阅模型,将消息以日志形式存储。
  • 具有高度可伸缩性和可用性,适合构建大规模的实时数据流应用。
  • 支持多种客户端,包括 Java、Python、Go 等。

优点:缺点:适用场景:

  • Kafka 适用于需要高吞吐量、低延迟和大规模数据处理的应用,如日志收集、实时数据分析、事件驱动架构等。
  • 部署和配置复杂,需要专业知识。
  • 不适合小规模应用,相对复杂度高。
  • 高吞吐量和低延迟,适用于大规模数据处理和实时流处理。
  • 可伸缩性强,支持构建大规模数据管道。
  • 数据持久化和数据复制,确保数据的可靠性。

七、技术选型

RabbitMQ 和 Kafka其中,RabbitMQ 和 Kafka 是最常用的两种消息中间件,它们两者的主要区别有:

  • 性能:消息中间件的性能主要衡量吞吐量,Kafka 单机 QPS 能达到百万级别,RabbitMQ 单机 QPS 万级别,kafka 更高;
  • 数据可靠性:kafka 和 rabbitMQ 都具备多副本机制,数据可靠性都比较高;
  • 消费模式:Kafka 由客户端主动拉取,RabbitMQ 支持主动拉取和服务器推送两种模式。所以 RabbitMQ 的消息实时性更高,且对于消费者来说更简单;而 kafka 可以由消费者根据自身情况去拉取消息,吞吐量更高;
  • 幂等性:kafka 支持单个生产者,单分区单会话的幂等性,而 RabbitMQ 不支持;
  • 其它特性:RabbitMQ 支持优先级队列,延迟队列,死信队列(存储无法被消费的消息队列)等等。

如何选择合适的消息中间件在应用开发中,选择适合的消息中间件取决于具体需求:

  • 如果你的应用是一个中小型系统,对性能要求不高,而更关注简单的使用和快速开发,那么 ActiveMQ 可能是不错的选择。
  • 如果你需要处理大规模消息传递,追求高性能和低延迟,那么 RocketMQ 或 Kafka 可能更适合,具体选择取决于你的应用类型和需求。
  • 如果你的应用是企业级应用,需要可靠性和事务支持,但对性能要求不高,那么 RabbitMQ 可能是一个不错的选择。
  • 最终的选择还取决于你的技术栈、团队的经验以及具体的业务需求。建议在选择消息中间件之前仔细评估你的应用需求,并根据具体情况进行选择。

当然,无论选择哪种消息中间件,都需要深入了解其特点和使用方式,以确保它能够满足应用需求,以构建高效、可靠的分布式系统。

八、结语

不管用哪种消息中间件,我们在日常生活中都可以常常见到消费队列的妙用。

有了这些缓冲方式,我们的日常出行和消费秩序才能够很好地得到保障。

最终,我们在鹿嘴山庄赏玩了一会,去了《美人鱼》的拍摄基地,然后准备乘坐观光车回杨梅坑。

这时,天色已经变黑,但排队的人数还是很多。看过文章后,想必大家已经知道此时我们需要用到什么方式来解决高峰流量的问题了,你学废了吗?



Tags:消息中间件   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
聊聊消息中间件MQ
一、概念图片 消息中间件MQ(Message Queue)是一种常用的异步通信技术,它通过将消息存储在队列中,实现生产者和消费者之间的解耦。MQ的主要作用是保证消息的可靠传输和幂等性。...【详细内容】
2023-10-24  Search: 消息中间件  点击:(173)  评论:(0)  加入收藏
应对流量高峰的利器——消息中间件
一、引言周末和朋友一起自驾去海边玩,去过杨梅坑的应该都知道,从杨梅坑到鹿嘴山庄需要坐快艇过去。不愧是深圳游玩景点上稳居 TOP5 的地方,下午四五点的时候排队坐艇的人还是非...【详细内容】
2023-10-16  Search: 消息中间件  点击:(192)  评论:(0)  加入收藏
在Linux系统中实现容器化的消息中间件:RabbitMQ和Kafka
消息中间件在现代分布式系统中起着至关重要的作用。它们可以在不同的应用程序之间实现可靠的异步通信,提供高吞吐量、低延迟和可扩展性。下面将介绍如何在Linux系统中使用容...【详细内容】
2023-09-08  Search: 消息中间件  点击:(374)  评论:(0)  加入收藏
Java如何使用消息中间件ActiveMQ?
创建ActiveMQ连接:import javax.jms.*;import org.apache.activemq.ActiveMQConnectionFactory;public class ActiveMQExample { public static void main(String[] args...【详细内容】
2023-08-16  Search: 消息中间件  点击:(281)  评论:(0)  加入收藏
30分钟带你了解「消息中间件」Kafka、RocketMQ
消息中间件的应用场景 异步解耦 削峰填谷 顺序收发 分布式事务一致性腾讯应用案例: 主流 MQ 框架及对比 说明 Kafka:整个行业应用广泛 RocketMQ:阿里,从 apache 孵化 Pulsar:雅...【详细内容】
2021-01-26  Search: 消息中间件  点击:(409)  评论:(0)  加入收藏
聊聊消息中间件的关键特性和问题总结
今天闲聊下消息中间件的一些关键特性,对于消息中间件基础知识,包括各种开源消息中间件的比较选型文章,网上已经有很多,在这里就不再重复进行描述。因此这篇文章仅仅选择一些消...【详细内容】
2020-11-24  Search: 消息中间件  点击:(240)  评论:(0)  加入收藏
什么是分布式消息中间件?
此公众号会从消息中间件的一些概念出发,陆续介绍分布式消息中间件的应用领域,涉及的技术等,最后到自己设计和实现一个分布式消息中间件。第一次写公众号,文章的结构组织并不...【详细内容】
2019-12-25  Search: 消息中间件  点击:(416)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条