Spring Cloud Alibaba--ActiveMQ微服务详解之消息队列(四)

news2024/11/13 7:57:27

        上篇讲述高并发情况下的数据库处理方式:分布式事务管理机制。即使我们做到这一步并发情况只能稍微得到缓解,当然千万级别的问题不大,但在面对双十一淘宝这类的达上亿的并发的时候仅仅靠分布式事务管理还是远远不够,即使数据库可以抗住压力,但从前端访问上并不能根本解决数据库可重复读的问题。

        解决并发问题的方式很多单都无法彻底解决并发问题,因为并发问题以现有的技术无法解决,但我们可以尽可能的使系统无线扩大并发量以达到完全处理并发的效果,限流、熔断都是不错的选择,但会出现系统无法访问的情况,当并发进入到系统的时候直接处理业务功能显然不合适,如果把并发进行队列化操作显然更加合适公平。举个栗子,做核酸检测的医护人员就几个而做核酸检测的人却多的数不过来,如果这些人一块围着谁也做不了核酸,此时排队等待是最适合的先到先排先做。MQ就是维持秩序的管理员,将并发进行排队。

1、MQ介绍

        当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify、MetaQ、RocketMQ等。

        本文使用ActiveMQ,无论哪种MQ技术都会涉及到消息的存储性、可靠性、传递性等,基本属性都会包含消息生产者、消费者两部分,推送方式一般为订阅广播、点对点的方式。字面意思广播就是通过网络广播发送消息,MQ不关注接收方是否在线,点对点是A端到B端双方进行握手通信后再传输数据。两者比较广播效率更高,但数据丢失率也高,数据安全性低,点对点传输效率相对广播低、数据丢失率低、如果B端掉线消息可以做持久化存储,等待B端上线握手后再次发送。

2、windows系统MQ服务部署

        官网:https://activemq.apache.org/

        官网提供两个版本的MQ供下载,Classic版本为当前稳定版本,Artemis版本为下代版本本文使用Classic版本。下载windows版本的压缩包ActiveMQ 5.16.5.zip。各版本的MQ对应Java JDK版本要看清楚。

        下载完成后解压zip,进入到MQ文件夹下如下:

         进入bin目录下,根据系统选择32位或者64位进入文件夹,运行activemq.bat脚本。

        本地访问http://localhost:8161账号/密码为admin

        点击进入管理界面,至此MQ服务启动成功。消息管理中心有Queues,Topics,Subscribers等我们可以查看队列、订阅等信息。

        Topics:是基于“订阅-发布”模式,当操作者发布一条消息后,所有对这条消息感兴趣的订阅者都可以收到它——也就是说这条消息会被拷贝成多份,进行分发。只有当前“活动的”订阅者能够收到消息。

        Queues:是一种“负载均衡模式”的实现。一个消息能且只能被一个消费者接受。如果当前JMS-Queue中没有任何的消费者,那么这条消息将会被Queue存储起来(实际应用中可以存储在磁盘上,也可以存储在数据库中,看软件的配置),直到有一个消费者连接上。另外,如果消费者在接受到消息后,在他断开与JMS-Queue连接之前,没有发送ack信息(可以是客户端手动发送,也可以是自动发送),那么这条消息将被发送给其他消费者。

比较项目Topic 模式队列Queue 模式队列
工作模式“订阅-发布”模式,如果当前没有订阅者,消息将会被丢弃。如果有多个订阅者,那么这些订阅者都会收到消息“负载均衡”模式,如果当前没有消费者,消息也不会丢弃;如果有多个消费者,那么一条消息也只会发送给其中一个消费者,并且要求消费者ack信息。
有无状态无状态Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。
传递完整性如果没有订阅者,消息会被丢弃消息不会丢弃
处理效率由于消息要按照订阅者的数量进行复制,所以处理性能会随着订阅者的增加而明显降低,并且还要结合不同消息协议自身的性能差异由于一条消息只发送给一个消费者,所以就算消费者再多,性能也不会有明显降低。当然不同消息协议的具体性能也是有差异的

3、系统集成

        服务启动后我们需要在系统中集成MQ并进行收发消息测试,在父工程下创建MQ子工程。在子工程pom中添加MQ依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
</dependency>

        在启动类上添加注解@EnableJms。

在需要使用MQ进行业务处理的服务中依赖MQ服务,并添加MQ配置信息:

server:
  port: 8081
spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
  jms:
    pub-sub-domain: true # 默认为false,点对点模式queue  true订阅模式topic
 
  pool:
    enabled: false # 是否创建 JmsPoolConnectionFactory 连接池
    idle-timeout: 30s # 空闲连接超时时间
    max-connections: 50 # 连接池中最大连接数
    max-sessions-per-connection: 100 # 每个连接最大会话

        编写MQ配置类:

@Configuration
public class BeanConfig {

    @Value("${spring.activemq.broker-url}")
    private String brokerUrl;

    @Value("${spring.activemq.user}")
    private String userName;

    @Value("${spring.activemq.password}")
    private String password;

    //定义存放消息的队列
    @Bean
    public ActiveMQQueue queue() {
        return new ActiveMQQueue("MyQueue");
    }

    @Bean
    public ActiveMQTopic topic() {
        return new ActiveMQTopic("MyTopic");
    }

    @Bean
    public ConnectionFactory connectionFactory() {
        return new ActiveMQConnectionFactory(userName, password, brokerUrl);
    }

    /**
     * 在 Queue 模式中,对消息的监听需要对containerFactory进行配置
     */
    @Bean("queueListener")
    public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        return factory;
    }

    /**
     * 在 topic 模式中,对消息的监听需要对containerFactory进行配置
     */
    @Bean("topicListener")
    public JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }
}

        编写Queue监听类和Topic监听类:

@Component
public class MyQueueListener {

    @JmsListener(destination = "MyQueue", containerFactory="queueListener")
    public void handleMessage(String name) {
        System.err.println(name);
    }

}

 

@Component
public class MyTopicListener {

    @JmsListener(destination = "MyTopic", containerFactory="topicListener")
    public String handleMessage1(String name) {
        System.out.println("topic 成功接受Name" + name);
    }
}

        编写消息发送接口 :


@Controller
@RestController("/demo")
public class Demo {

    @Autowired
    private Queue queue;

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    /**
     * 发送消息接口
     * @param msg
     */
    @GetMapping("/{msg}")
    void demo(@PathVariable String msg) {
        // 消息入队列
        jmsMessagingTemplate.convertAndSend(queue, msg);
    }

}

         访问接口传入消息参数:

         

        可以看到控制台打印输出消息内容。至此系统集成MQ完成。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Django和vue的微博用户情感分析系统

完整代码&#xff1a;https://download.csdn.net/download/weixin_55771290/87471350概述这里简单说明一下项目下下来直接跑起的方法。前提先搞好python环境和vue环境,保证你有一个账户密码连上数据库mysql。1、pip install requirements.txt 安装python包2、修改mysql数据库的…

Hadoop HDFS的主要架构与读写文件

一、Hadoop HDFS的架构 HDFS&#xff1a;Hadoop Distributed File System&#xff0c;分布式文件系统 &#xff11;&#xff0c;NameNode 存储文件的metadata&#xff0c;运行时所有数据都保存到内存&#xff0c;整个HDFS可存储的文件数受限于NameNode的内存大小一个Block在…

使用物联网进行智能能源管理的10大优势

如今&#xff0c;物联网推动了许多行业的自动化流程和运营效率&#xff0c;而物联网在能源领域的应用尤其受到消费者、企业甚至政府的关注。除了对电力供应链的诸多好处之外&#xff0c;物联网能源管理系统还让位于新的智能电网&#xff0c;并有望实现更高的安全性和效率。基于…

软件架构知识6-高性能数据库集群:读写分离

一、读写分离 读写分离原理&#xff1a;将数据库读写操作分散到不同的节点上&#xff1a; 读写分离的基本实现是&#xff1a; 1、数据库服务器搭建主从集群&#xff0c;一主一从&#xff0c;一主多从都可以&#xff1b; 2、数据库主机负责读写操作&#xff0c;从机只负责读操…

【2023-02-20】JS逆向之翼支付

提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径 文章目录前言分析总结前言 真的好久没更了…… 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 分析 进到网页&#xff0c;加载两个接口 applyLoginFactor 接口返回一个RSA公钥&#xff0…

vulnhub zico2

总结&#xff1a;脏牛提权 目录 下载地址 漏洞分析 信息收集 木马上传 反弹shell 提权 下载地址 zico2.ova (Size: 828 MB)Download: https://www.dropbox.com/s/dhidaehguuhyv9a/zico2.ovaDownload (Mirror): https://download.vulnhub.com/zico/zico2.ova使用方法&…

机智的Open3D学习生活(第一集):入坑前的准备工作

1、Open3D的开源项目地址&#xff1a; https://github.com/isl-org/Open3D 2、Open3D的官网地址&#xff1a; http://www.open3d.org/ 3、Open3D的文档地址&#xff1a;http://www.open3d.org/docs/latest/tutorial/visualization/cpu_rendering.html 后续我将以此文档作为蓝…

如何单独清除某个网页的缓存(reload)

有时候在自己服务器上调试的时候&#xff0c;刷新一直不更新&#xff0c;样式改了也看不到&#xff0c;就很烦 今天教你一个方法快速清除 F12 控制台情况下右击左上角的刷新 这三个分别代表&#xff1a; ①正常重新加载(Ctrl R): 正常重新加载 此方法,浏览器发送请求时会…

深入Spring底层透析Bean创建过程之拨云见日篇

目录前言一.BeanFactory快速入门1. BeanFactory创建Bean2. BeanFactory和ApplicationContext的关系3. 和ApplicationContext区别(高频问点)4. BeanFactory的继承体系5. ApplicationContext的继承体系二.Bean实例化的基本流程&#xff08;重点)前言 首先感谢您的阅览&#xff0…

Git复习

1. 引言 现在要用到Git&#xff0c;复习一下关于Git的指令&#xff0c;知识摘自《Pro Git》 2. 起步 git和其他版本控制软件最大的差别在于git是直接记录某个版本的快照&#xff0c;而不是逐渐地比较差异。 安装: sudo apt install git-all设置用户信息&#xff1a; git c…

上海亚商投顾:沪指放量大涨 券商等权重板块全线飙升

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日集体反弹&#xff0c;沪指、深成指单边拉升&#xff0c;午后均涨超2%&#xff0c;上证50大涨超2.7%&…

加入CSDN的一年,我收获了这些……

加入CSDN的一年&#xff0c;我收获了这些……加入CSDN的一年&#xff0c;我收获了这些……加入CSDN的一年&#xff0c;我收获了这些…… &#x1f680;&#x1f680;时光如白驹过隙般&#xff0c;飞逝而过。一转眼&#xff0c;我就已经是一名大二的学生了&#xff0c;也已经在…

LeetCode 每日一题2347. 最好的扑克手牌

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

Homekit智能家居一智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…

网络高可用方案

目录 1. 网络高可用 2. 高可用方案设计 2.1 方案一 堆叠 ha负载均衡模式 2.2 方案二 OSPF ha负载均衡模式 3. 高可用保障 1. 网络高可用 网络高可用&#xff0c;是指对于网络的核心部分或设备在设计上考虑冗余和备份&#xff0c;减少单点故障对整个网络的影响。其设计应…

猜数字大小 II

力扣链接 力扣 题目描述&#xff1a; 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字&#xff0c;就会 赢得游戏 。如果你猜错了&#xff0c;那么我会告诉你&#xff0c;我选的数…

SpringBoot 快速入门

SpringBoot简介 SpringBoot 是由Pivotal 团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。 SpringBoot 基础配置 创建一个SpringBoot项目 2.6.6 浏览器访问:http://localhost:8080/user/1 结果如下所示:

从FastJson库的不同版本源码中对比学习绕过方法

1.2.25<fastjson<1.2.41反序列化漏洞。 从这个版本的fastjson中&#xff0c;对前面的漏洞进行了修复&#xff0c;引入了checkAutoType安全机制&#xff0c;默认autoTypeSupport关闭&#xff0c;不能直接反序列化任意类&#xff0c;而打开 AutoType 之后&#xff0c;是基…

计算机网络笔记(五)—— 网络层

网络层概述 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 需要解决的问题&#xff1a; 网络层提供的两种服务 1. 面向连接的虚电路&#xff08;逻辑上的连接&#xff0c;而不是物理连接&#xff09;服务 2. 无连接的数据报服务&#xff…

Vbs_To_Exe制作简易exe程序

文章目录一、准备vbs脚本文件二、工具打包exe一、准备vbs脚本文件 新建一个文本文档 复制下面代码到文本文档中 Set speech CreateObject("SAPI.SpVoice") speech.Speak "l love you!"修改文本后缀为.vbs。编码选择ANSI&#xff08;解决中文乱码问题&am…