消息队列的原理与基本使用

文章目录

  • 消息队列
    • 定义
    • 优点 与 缺点
      • 优点
      • 缺点
      • 常见的消息队列
    • 消息队列的配置
    • 消息队列的简单使用
      • 生产者
      • 消费者
      • 运行

消息队列

定义

消息队列(message queue)是一种用于在软件系统中传输、存储和处理消息的机制。它通常用于异步通信,允许不同的组件或系统在时间上解耦,以便它们可以独立地生产和消费消息。消息队列通常由一个服务或软件组件管理,它负责接收、存储和传递消息,并确保消息按照一定的顺序和规则进行处理。

消息队列的基本原理是将消息从一个发送者发送到一个或多个接收者。发送者将消息放入队列中,而接收者则从队列中获取消息进行处理。

优点 与 缺点

优点

  • 解耦性:生产者者和消费者之间不直接通信,而是通过队列进行消息传递,从而减少了组件之间的耦合度。如果某个服务挂掉,不会影响其他服务,可以通过后期进行重新补偿。
  • 异步性:生产者可以继续执行而无需等待接收者的响应,提高了系统的并发性和性能。每次多增加服务,只需要多添加一个消费者即可。
  • 削峰性:队列可以暂时存储消息,以防止消息丢失或超载。

其实就是相当于一个暂存箱,存入数据,然后不同功能对其进行异步处理,而不像传统的同步处理。这样就很好的解释了解耦和异步的特点。

而对于削峰,也很好理解,比如在购物秒杀系统中,某一瞬间,会突然来大量的订单,如果采用传统的方式,会导致服务器负载过高,甚至崩溃,使用消息队列可以作为缓冲,将订单先暂存下来,等待后端后面慢慢的处理,从而更好的应对高峰流量。

这样就实现了系统的高可用、高性能、高并发

缺点

  • 复杂性增加: 引入消息队列会增加系统的复杂度,需要额外的部署、维护和监控。

  • 消息丢失: 在一些情况下,消息队列可能会出现消息丢失的情况,例如由于网络问题或者队列本身的问题导致消息无法正确传递。需要对消息进行适当的备份。

  • 一致性问题(事务问题): 如果消息队列中的消息被重复消费或者消费顺序不正确,可能会导致系统出现一致性问题。同时也需要考虑服务的事务性,考虑补偿处理或事务处理。

  • 性能损耗: 引入消息队列会增加系统的延迟和资源消耗,尤其是在消息队列的读写操作上。

常见的消息队列

RabbitMQ:RabbitMQ 是一个开源的消息队列系统,基于 AMQP(高级消息队列协议)实现。它支持多种消息传输模式,包括点对点、发布/订阅、路由等,具有高度的灵活性和可定制性。RabbitMQ 提供了丰富的功能,包括消息持久化、消息确认、消息队列监控等,被广泛应用于分布式系统和微服务架构中。

Apache Kafka:Apache Kafka 是一个分布式流处理平台和消息队列系统,最初由 LinkedIn 开发并开源。它设计用于处理大规模的实时数据流,具有高吞吐量、持久性、可伸缩性和容错性。Kafka 采用分布式的日志架构,消息被持久化存储在磁盘上,并通过多个分区进行分布式处理,常用于日志收集、事件驱动架构等场景。

Amazon SQS:Amazon Simple Queue Service(SQS)是亚马逊提供的一种完全托管的消息队列服务。它具有高度可靠性、可伸缩性和安全性,可以在不同的应用程序之间可靠地传输消息。SQS 支持标准队列和 FIFO 队列两种类型,适用于不同的使用场景。

Apache ActiveMQ:Apache ActiveMQ 是一个基于 Java 实现的开源消息队列系统,支持多种通信协议,包括 OpenWire、STOMP、AMQP、MQTT 等。它具有丰富的特性,包括消息持久化、事务支持、集群和负载均衡等,被广泛应用于企业级应用和集成系统中。

Redis:Redis 是一个开源的内存数据库和缓存系统,同时也可以用作消息队列。Redis 的发布/订阅功能可以实现简单的消息传递,而 Redis 的列表数据结构也可以用于构建基本的队列系统。尽管 Redis 不是专门设计用作消息队列,但在一些场景下可以作为简单的消息传递机制使用。

消息队列的配置

这里使用的Kafka
导入依赖:

        <!--消息队列-->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

配置参数:

spring:
  redis:
    host: 填写ip
    port: 6379
    password: 123456
  kafka:
    bootstrap-servers: 填写ip:9092
    consumer:
      group-id: 
  • bootstrap-servers:指定 Kafka 集群中的一个或多个 broker 地址。填写 Kafka 集群中任意一个 broker 的 IP 地址和端口号。客户端通过连接这些 broker 来发现整个 - - Kafka 集群的拓扑结构,并进行数据交换。
  • consumer:这一部分可能是消费者配置的一部分,指定了消费者的一些参数。
  • group-id:指定消费者所属的消费者组 ID。消费者组是 Kafka 中一个重要的概念,它允许多个消费者协同工作来处理主题中的消息。同一个消费者组内的消费者共享消息,但每个消息只能被消费者组内的一个消费者处理。这个配置项定义了消费者所属的组 ID。

消息队列的简单使用

生产者

编写controller,和其他一样,注入KafkaTemplate使用即可。

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.annotation.Resource;

@RestController
public class KafkaController {

    @Resource
    private KafkaTemplate kafkaTemplate;

    @GetMapping("/produce")
    public String produce(String message) {
        kafkaTemplate.send("order", message);

        return "发消息成功";
    }
}
  • send方法,发送消息到order队列中。

消费者

编写listen,监听消息队列中的消息。

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class KafkaListen {

    @KafkaListener(topics = {"order"})
    public void listen(ConsumerRecord<String, String> record) {

        System.out.println("卡夫卡推送的消息内容:" + record.value());
        System.out.println("我收到了消息");
    }
}
  • @KafkaListener(topics = {“order”}) 表示监听order这个消息队列
  • ConsumerRecord<String, String> record 表示要处理的数据

运行

例如我请求produce发送三条消息,1,2,3到消息队列
消费者就能监听到
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438515.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:探索计算机的自我进化之路

当我们谈论机器学习时&#xff0c;我们在谈论什么呢&#xff1f;机器学习是一门跨学科的学科&#xff0c;它使用计算机模拟或实现人类学习行为&#xff0c;通过不断地获取新的知识和技能&#xff0c;重新组织已有的知识结构&#xff0c;从而提高自身的性能。简单来说&#xff0…

导数与微分错题本

《1800》 1 缺乏构造函数的技巧 2 3 等价无穷小构造函数 4 这个构造有点难。补充几个数字构造导数定义 5 6 通过举例子排除真的好 7 8 我不想输 9 注意自变量为x的平方 10 导数对应的x为y的变量 11 代入定义式 12 13 14 15 16 17 18 19 20

php调用guzzlehttp库时出现Segmentation fault的解决方案

先说结论&#xff0c;这个问题的原因是因为php7.4与openssl3不兼容产生的&#xff0c;解决方案如下&#xff1a; 输入openssl version -a查看openssl版本&#xff0c;如果是3以上的版本与php7.4不兼容&#xff0c;7.4以下的没测试过&#xff0c;估计也有问题。我最终是安装上了…

日韩媒体宣传案例分析:CloudNEO 为您提供海外媒体宣传最佳途径

近年来&#xff0c;随着互联网的迅速发展和全球化的加速推进&#xff0c;海外市场对于企业的重要性日益凸显。尤其是在亚洲地区&#xff0c;日本和韩国作为亚洲最具活力和潜力的市场之一&#xff0c;成为众多企业争相开拓的目标。在这个过程中&#xff0c;媒体宣传不仅是企业推…

【机器学习】详解正则化思想

我们的生活当中真正有意义或者有价值的部分可以概括为两句话&#xff1a;一句话是&#xff1a;弄清楚某个东西是怎么一回事&#xff0c;另一句话是&#xff0c;弄清楚某个东西是怎么一回事。头一句话&#xff0c;我们弄清楚的那个东西对于我们而言是未知的&#xff0c;但是已经…

算法49:动态规划专练(力扣1139题:最大正方形面积)

题目&#xff1a; 给你一个由若干 0 和 1 组成的二维网格 grid&#xff0c;请你找出边界全部由 1 组成的最大 正方形 子网格&#xff0c;并返回该子网格中的元素数量。如果不存在&#xff0c;则返回 0。 示例 1&#xff1a; 输入&#xff1a;grid [[1,1,1],[1,0,1],[1,1,1]…

【如何成为一名好的系统架构设计师】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱1.如何成为一名好的系统架构设计师1.1 如何衡量一名优秀架构设计师1) 作为技术领导者2) 作为开发人员3) 聚焦系统4) 具备企业家思维5) 权衡策略思维与战术思维6) 良好的沟通 1.2 从工程师到系统架构设计师的…

sql server使用逗号,分隔保存多个id的一些查询保存

方案一&#xff0c;前后不附加逗号&#xff1a; 方案二&#xff0c;前后附加逗号&#xff1a; 其他保存方案&#xff1a; &#xff08;这里是我做一个程序的商家日期规则搞得&#xff0c;后面再补具体操作&#xff09;&#xff1a; 1,2,3 | 1,2,3 | 1,2,3; 1,2,3 &#xff1…

如何恢复未保存的 Excel 文件

本周我们将 Office 恢复系列扩展到 Excel 恢复&#xff0c;并提出了最常见的问题&#xff1a;如何恢复 Excel 文件&#xff1f; 与 Office Word 不同&#xff0c;Excel 完全是关于表格和计算的。在处理Excel文件时&#xff0c;您可能会遇到更多问题。与往常一样&#xff0c;我们…

STM32CubeMX学习笔记15---CAN总线

1、CAN简介 CAN总线网络的结构有闭环和开环两种形式 闭环结构的CAN总线网络&#xff0c;总线两端各连接一个1202的电阻。这种CAN总线网络由ISO11898标准定义&#xff0c;是高速、短距离的CAN网络&#xff0c;通信速率为125kbit/s到1Mbit/s。在1Mbit/s通信速率时&#x…

【嵌入式——QT】Model/View

【嵌入式——QT】Model/View 基本原理数据模型视图组件代理Model/View结构的一些概念QFileSystemModelQStringListModelQStandardItemModel自定义代理 基本原理 GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据&#xff0c;典型的如数据库应用程序&#xff0c;数…

wsl 安装 ubuntu

文章目录 打开Windows PowerShell查看可安装的ubuntu安装相对应的ubuntu将用户添加到sudoers文件中&#xff0c;并赋予了该用户sudo权限。 打开Windows PowerShell 以管理员的身份运行 查看可安装的ubuntu wsl.exe --list --online安装相对应的ubuntu wsl --install 版本…

计算机网络面经-HTTPS加密过程

前言 在上篇文章HTTPS详解一中&#xff0c;我已经为大家介绍了 HTTPS 的详细原理和通信流程&#xff0c;但总感觉少了点什么&#xff0c;应该是少了对安全层的针对性介绍&#xff0c;那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。 HTTPS 和 HTTP的区别 显然&am…

安装zabbix

部署Zabbix监控平台 部署一台Zabbix监控服务器&#xff0c;一台被监控主机&#xff0c;为进一步执行具体的监控任务做准备&#xff1a; 安装LNMP环境源码安装Zabbix安装监控端主机&#xff0c;修改基本配置初始化Zabbix监控Web页面修改PHP配置文件&#xff0c;满足Zabbix需求…

2024 GoLand激活,分享几个GoLand激活的方案

文章目录 GoLand公司简介我这边使用GoLand的理由GoLand 最新变化GoLand 2023.3 最新变化AI Assistant 正式版GoLand 中的 AI Assistant&#xff1a;_Rename_&#xff08;重命名&#xff09;GoLand 中的 AI Assistant&#xff1a;_Write documentation_&#xff08;编写文档&…

VScode+Zotero+Latex文献引用联动

一、VScodeLatex联动 1、VScode的安装 2、texlive.iso安装 可以参考以下&#xff0c;也可以忽略所有直接一步一步默认安装 https://zhuanlan.zhihu.com/p/442308176 3、Vscode的插件安装&#xff1a;【latex workshop】 4、打开设置&#xff0c;搜索json&#xff0c;然后点击…

最新基于R语言lavaan结构方程模型(SEM)技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

JVM运行时数据区——对象的实例化内存布局与访问定位

文章目录 1、对象的实例化1.1、创建对象的方式1.2、创建对象的步骤 2、对象的内存布局3、对象的访问定位3.1、对象访问的定位方式3.2、使用句柄访问3.3、使用指针访问 4、小结 平时大家经常使用new关键字来创建对象&#xff0c;那么我们创建对象的时候&#xff0c;怎么去和运行…

css 用flex做成田字型

哈喽&#xff0c;各位小伙伴&#xff01;今天给大家来css控制div完成田字型样式&#xff0c;来&#xff0c;看看下面的效果图&#xff1a; 一看就知道你们想要代码了&#xff0c;不急。代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&…

Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

一、前言 为什么需要判断视频文件是否含有B帧&#xff0c;这个在推流的时候很容易遇到这个问题&#xff0c;一般来说&#xff0c;没有B帧的视频文件&#xff0c;解码后的数据帧pts和dts都是顺序递增的&#xff0c;而有B帧的则未必&#xff0c;可能有些需要先解码后面显示&…