概述
约 2120 字大约 7 分钟
2025-02-27
同步/异步
同步调用
同步调用是指客户端调用远程服务时,需要等待服务端返回结果后才能继续执行,典型的场景如远程调用 HTTP 服务。
同步调用的优势:时效性强,等到结果后才返回–需要查询结果的通常用同步调用
同步调用的问题:
- 拓展性差–增加功能要改代码
- 性能下降–调用链路长,每次都是阻塞等待上一个服务
- 级联失败问题–一个服务挂掉,整个链路上的服务都出问题
异步调用
异步调用是指客户端调用远程服务时,不需要等待服务端返回结果,而是直接返回一个代表请求的消息,典型的场景如消息队列。当服务端处理完请求后,通过消息队列通知客户端。
异步调用的优势:提升性能–不需要等待结果,可以继续执行–适合处理耗时长的请求
消息中间件
概念
消息中间件(Message Queue,MQ)是一种应用程序之间的数据交换方式,它是一种分布式系统架构模式,用于在不同的应用程序之间传递消息。消息中间件的主要功能是实现应用间的松耦合,让信息的发送方和接收方不需直连,而是通过消息中间件进行交互。
- 消息: 简单的说就是软件之间通讯时传递的数据,它可以是很简单的数字、字母,也可以是很复杂的嵌套对象数据。
- 中间件:最简单的理解是第三者,本来软件A和软件B间的通讯两者直接传递消息就可以了,但是,此时中间件作为第三者,非要先让软件A通讯的消息先发给它,再由它发给软件B(感觉就是中间商一样),下面通过图来更好的理解它们。
- 消息队列:是消息中间件的一种实现方式。
总结:消息中间件则是将软件与软件之间的交互方式进行存储和管理的一种技术,也可以看做是一种容器
作用
- 异步通信:消息队列可以实现应用间的异步通信,应用只需要将消息放入队列,不用等待回复,就可以继续执行。
比如我们最常见的短信验证码功能,当我们在界面点击“获取验证码”后,我们还可以同时进行其他的操作,如输入更新的密码等,此时,我们不需要一直等到手机收到短信了才进行下一步的操作,这就是异步处理,提高了用户体验。
- 解耦合:通过消息队列解耦合应用,应用之间不再需要直连,而是通过消息队列进行通信。
比如常见的订单系统,当有订单下单时,我们需要减去库存,但如果订单、库存的逻辑都放在一个系统中,不止处理事件需要很长,系统的耦合性比较高,此时,使用消息中间件,可以实现将订单业务和库存业务抽出来做不同的系统,每次下单的时候可以将下单信息放入消息中间间中,然后库存系统去订阅它,只有有订单数据就进行减去库存操作,这样就将应用解耦了
- 削峰填谷:通过消息队列可以有效地削峰填谷,避免应用因消息处理过慢而出现性能问题。
如常见的秒杀系统,如果有5万个商品可以秒杀,没有消息中间件的话,所有的请求都一次性到后台,此时系统很容易卡死,引入消息中间件如消息队列,此时可以在队列中设置好可以存储数据的数量,这样每次用户请求会先但消息队列中,消息队列就减去1,当消息队列中存储长度为0时,直接返回秒杀失败,这样就避免了所有用户请求可能在同一时间到达系统后台,达到流量削峰的作用
- 广播消费:消息队列可以实现广播消费,一个消息可以被多个消费者消费。
常见的消息中间件
- ActiveMQ:Apache 出品,主要用于企业级的消息中间件,支持多种协议,包括 AMQP、MQTT、STOMP 等。
- RabbitMQ:RabbitMQ 是一款开源的消息队列软件,由 Erlang 语言编写,基于 AMQP 协议。
- Kafka:Apache 出品,主要用于大数据实时处理,支持多种协议,包括 Apache Kafka、Apache Pulsar 等。
- RocketMQ:阿里巴巴开源的消息队列软件,主要用于微服务架构。
其他中间件
- 分布式消息中间件:RocketMQ、Kafka、ActiveMQ 等。
- 负载均衡中间件:Nginx、LVS、HAProxy 等。
- 缓存中间件:Redis、Memcached 等。
- 数据库中间件:MySQL、MongoDB 等。
- 搜索引擎中间件:ElasticSearch、Solr 等。
- 日志中间件:Logstash、Flume 等。
- 容器中间件:Docker、Kubernetes 等。
RabbitMQ
简介
RabbitMQ 是一款开源的消息队列软件,由 Erlang 语言编写,基于 AMQP 协议。RabbitMQ 最初起源于金融系统,用于在分布式系统中存储和转发消息。RabbitMQ 是一个在分布式系统中用于存储和转发消息的消息队列,它可以实现可靠的消息传递,支持多种消息队列协议,包括 AMQP、STOMP、MQTT 等。RabbitMQ 是一个非常灵活的消息队列,可以支持多种应用场景,如任务队列、事件驱动、数据流、消息分发等。
特点
- 高可用性:RabbitMQ 集群保证消息的高可用性,即使部分节点发生故障,也能保证消息的传递。
- 灵活的路由机制:RabbitMQ 支持多种路由机制,包括点对点、发布/订阅、主题等。
- 多种协议支持:RabbitMQ 支持多种消息队列协议,包括 AMQP、STOMP、MQTT 等。
- 多种语言客户端:RabbitMQ 提供多种语言的客户端,如 Java、.NET、Python、Ruby 等。
- 管理界面:RabbitMQ 提供了一个易用的管理界面,可以直观地查看消息队列的状态。
- 多种插件支持:RabbitMQ 提供了许多插件,可以实现各种功能,如消息持久化、消息确认、消息集群、Web 管理界面等。
方式
- 点对点(P2P):点对点通信,一个生产者发送消息到一个队列,一个消费者从同一个队列中接收消息。
- 发布/订阅(Pub/Sub):发布/订阅通信,一个生产者发送消息到一个交换机,多个消费者从同一个交换机订阅同一个主题的消息。
- 主题(Topic):主题通信,一个生产者发送消息到一个主题交换机,多个消费者从同一个主题交换机订阅同一个主题的消息。
架构
- Server:又称Broker, RabbitMQ 服务器,用于存储、转发消息。
- 连接器(Connector):用于客户端和 RabbitMQ 服务器之间的网络连接。
- 生产者(Producer):消息的发送方,向 RabbitMQ 队列中发送消息。
- 交换机(Exchange):消息交换机,用于接收生产者的消息并将其路由到队列。
- 队列(Queue):消息队列,存储消息直到消费者取出并处理。
- 绑定(Binding):绑定,用于将交换机和队列进行关联。
- 路由键(Routing Key):路由键,用于指定消息的路由规则。
- 消费者(Consumer):消息的接收方,从 RabbitMQ 队列中接收消息并处理。
- 虚拟主机(Virtual Host):虚拟主机,用于隔离不同用户的权限。
- 信道(Channel):信道,用于连接到 RabbitMQ 服务器,并进行消息的传输。
运行流程
- 1.生产者将消息发送到交换机。
- 2.交换机根据路由规则将消息路由到队列。
- 3.队列将消息存储在内存中。
- 4.消费者从队列中获取消息并处理。
- 5.消费者确认消息已被处理。
- 6.RabbitMQ 服务器将消息发送给消费者。