Java中消息队列

MQ是Message Queue的缩写,也就是消息队列的意思,它是一种应用程序对应用程序的通信方法,使得应用程序能够通过读写出入列队的消息来进行通信,而无需要使用专用的连接来链接它们。消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削峰等问题。实现高性能,高可用,可伸缩和最终一致性架构,在消息队列中有生产者和消费者两种角色,生产者负责发送消息到消息队列,而消费者从消息队列中取出数据进行处理,这种方式实现生产者和消费者之间的解耦,使得他们可以独立运行和扩展。

优点

应用解耦

消息队列允许生产者和消费者之间松耦合,生产者只需要将消息发送到队列,而不需要关心消息这何时处理或者如何处理这些消息

异步处理

消息队列允许异步处理消息,这意味着接收者可以在自己方便的时候处理消息,而不是立即相应,这可以提高系统的吞吐量和响应时间

流量削峰

在高并发的场景下,消息队列可以起到缓冲的作用,平滑突发流量,保护后端系统免受冲击

缺点

可用性降低

如果消息队列服务成为单边故障,整个系统可能受到影响,因此,需要实施高可用性和容错策略,一般解决方式是非MQ架集群

复杂性提高

引入消息队列会增加系统的复杂性,因为需要配置和管理消息队列服务,同时还需要处理可能的消息丢失,重复或顺序错乱等问题。

一致性问题

在分布式系统中,使用消息队列时,如果消息队列发生了消息的丢失与重复,则可能会造成数据一致性的问题。

消息队列的应用场景主要分为以下三种:

1.异步处理:应用在实时性要求不高的一些场景,例如用户注册发送验证码、下单通知发送优惠券等。这些场景下,服务方只需要把协商好的消息发送到消息队列,剩下的由消费者的消息服务去处理,不需要等待消费者的返回结果就可以直接返回给客户端,返回给业务层面;

2.应用解耦:可以把一些相关的但是耦合度不高的一些系统关联起来,比如订单系统与优惠券积分系统有关联度,但是没有那么紧密,每个系统之间只需要把一些约定好的消息发送到MQ,另外的系统直接去消费就可以了,它可以允许各类系统间采用不同的一些框架和语言来实现,从而大大增加了整个系统的灵活度;

3.流量削峰:应用在大流量入口的一些短时间的业务,短时间内业务需求处理不完的一些服务,例如双十一秒杀、演唱会抢票等。为了权衡高可用把大量的一些并行任务发送给MQ。根据MQ的存储和分发功能平稳的去处理后续的一些业务,从而起到大流量缓冲的作用

说说RabbitMQ的基本架构设计

RabbitMQ的基本架构由以下几个部分组成:

1.生产者(Producer):生产者是消息的发送方,负责产生并发生消息到RabbitMQ。生产者通常将消息发生给交换机(Exchange),从而使其消费者没有强关联。

2.交换机(Exchange):交换机是消息的分发中心,负责将接收到的消息路由到一个或多个消息队列。它定义了消息的传递规则,可以根据规则将消息发送到一个或多个队列中。

直连交换机(Direct Exchange):将消息路由到与消息中的路由键(Routing Key)完全匹配的队列;

主题交换机(Topic Exchange):根据通配符匹配路由键(Routing Key),将消息路由到一个或多个队列;

扇出交换机(Fanout Exchange):将消息广播到所有与交换机绑定的队列,忽略路由键;

头部交换机(Headers Exchange):根据消息头中的属性进行匹配,将消息路由到与消息头匹配的队列。

3.队列(Queue):队列是消息的存储区,用于存储生产者发送的消息。消息最终会被消费者从队列中取出并处理。每个队列都有一个名称,并且可以绑定到一个或多个交换机。

4.消费者(Consumer):消费者是消息的接收方,负责从队列中获取消息并进行处理。消费者通过订阅队列来接收消息。

5.绑定(binding):绑定是交换机和队列之间的关联关系。生产者将消息发送到交换机,而队列通过绑定与交换机相连,从而接收消息。

6.虚拟主机(Virtual Host):虚拟主机是RabbitMQ的基本工作单元,每个虚拟主机都拥有自己独立的用户、权限、交换机、队列等资源,完全隔离于其他虚拟主机。

7.连接(Connection):连接是指生产者、消费者与RabbitMQ之间的网络连接。每个连接都可以包含多个信道(Channel),每个信道是一个独立的会话通道,可以进行独立的消息传递。

8.消息(Message):消息是生产者和消费者之间传递的数据单元。消息通常会包含消息体和可选的属性,如路由键等

相关推荐
liuyang-neu1 小时前
力扣 简单 70.爬楼梯
java·算法·leetcode
喵手1 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
硬汉嵌入式2 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
开心工作室_kaic3 小时前
ssm010基于ssm的新能源汽车在线租赁管理系统(论文+源码)_kaic
java·前端·spring boot·后端·汽车
Python私教3 小时前
Flutter颜色和主题
开发语言·javascript·flutter
代码吐槽菌3 小时前
基于SSM的汽车客运站管理系统【附源码】
java·开发语言·数据库·spring boot·后端·汽车
Ws_3 小时前
蓝桥杯 python day01 第一题
开发语言·python·蓝桥杯
zdkdchao3 小时前
jdk,openjdk,oraclejdk
java·开发语言
神雕大侠mu4 小时前
函数式接口与回调函数实践
开发语言·python