Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >消息队列MQ

消息队列MQ

作者头像
chenchenchen
发布于 2019-10-22 09:55:50
发布于 2019-10-22 09:55:50
1.8K00
代码可运行
举报
文章被收录于专栏:chenchenchenchenchenchen
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_38004638/article/details/102019234

  • 使用消息队列场景和好处
  • 使用消息队列会带来什么问题,有什么解决方案
  • 如何使用MQ(以ActiveMQ为例的简单例子)

1.消息队列的应用场景和好处:

异步-流量削峰

  我们先来看下传统的服务器接收处理请求的流程

  如上图,在不使用消息队列服务器的时候,用户的请求都直怼数据库,在高并发的情况下数据库压力剧增,不仅使得响应速度变慢,还可能因此而挂掉数据库,导致用户页面直接报错,项目经理找上门,然后#!%@!#* ......(PS:尽管是某服务挂了,但某宝的用户页面提示信息一定会甩锅给网络不通哦~)

  我们再来看加入消息队列服务器之后的接收处理请求的流程会发生什么变化

  如上图,在使用消息队列之后,即使在高并发的情况下用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理消息速度比数据库要快很多,因此响应速度(用户体验感)得到大幅改善。

  因此我们可以得出消息队列具有很好的流量削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削去高峰期的并发事务。如在某些电商平台的一些秒杀活动中,合理使用消息队列可以抵御活动刚开始大量请求涌入对系统的冲击。  因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票等。

异步-系统解耦

 我看也先来看看传统的系统数据传输模式

  如上图,主系统和其他系统的耦合性太强,都是直接调用,稍微有一点改动或者新增模块,双方都得改代码,过于麻烦

  然后,我们再来看看加入了消息队列之后,系统的结构会发生什么变化

  如上图,我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。

  消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。

  另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息。

   除发布订阅模式之外,消息队列还有其他的传输模式

点对点模型

  基础模型中,只有一个发送者、一个接收者和一个分布式队列。

生产者消费者模型

  如果发送者和接收者都可以有多个部署实例,甚至不同的类型;但是共用同一个队列,这就变成了标准的生产者消费者模型。在该模型,三个角色一般称为生产(Producer)、分布式队列(Queue)、消费者(Consumer)。

  中途小结:消息队列对系统的并发处理的能力和扩展性有所提升

2.使用消息队列会带来什么问题:

可用性降低: 在加入MQ之前,你不用考虑MQ服务器挂掉的情况,引入MQ之后你就需要去考虑了,可用性降低。

复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等问题。因此需要考虑的东西更多,系统复杂性增大。

数据一致性:消息队列带来的异步确实可以提高系统响应速度,但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了。

对于可用性问题

  引入消息队列后,系统的可用性下降。实际项目中发送MQ消息,如果不做集群,其中mq机器出了故障宕机了,那么mq消息就不能发送了,系统就崩溃了,所以我们需要集群MQ,当其中一台MQ出了故障,其余的MQ机器可以接着继续运转,在生产中,没人使用单机的消息队列。如果有,那肯定为了用而用(显得技术复杂一下,好忽悠多收点钱),对于这个问题,需要对MQ集群技术有比较深刻的理解,各种消息中间件的集群方式不同,下面以ActiveMq的集群为例(Zookeeper ActiveMq),先看图

  这种应用场景叫做master/slave(主/备模式),在这种场景下,我有三台服务器(主和备),任何情况下,只有“主”在工作,“备”是在主出现故障时,接替“主”来提供服务。在zookeeper的支持下,这一过程是这样实现的,Zookeeper提供目录和节点的服务,当我的三台服务器启动时,会在zookeeper的指定目录下创建对应自己的临时节点(这个过程称为“注册”),所谓临时节点,是靠心跳(定时向zookeeper服务器发送数据包)维系,当主服务器出现故障(无法向zookeeper服务器发送数据包,zookeeper会删除改临时节点。服务器向zookeeper注册时,zookeeper会分配序列号,我们认为序列号小的那个,就是“主”,序列号大的那个,就是“备”。

  当我们的客户端(通常是web server)需要访问服务时,需要连接zookeeper,获得指定目录下的临时节点列表,也就是已经注册的服务器信息,获得序列号小的那台“主”服务器的地址,进行后续的访问操作。以达到“总是访问主服务器”的目的。当“主”服务器发生故障,zookeeper从指定目录下删除对应的临时节点,同时可以通知关心这一变化的所有客户端,高效且迅速的传播这一信息。当下个请求来的时候,还是连接zookeeper,但是此时其实是访问备用的MQ。

对于复杂性问题

  1.如何保证消息不被重复消费呢?  要回答好这个问题,首先要知道为什么消息会被重复消费,大多都是因为网络不通导致,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者。所以解决问题的方式有如下三种思路

  1.如果消息是做数据库的插入操作,给这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。  2.如果你拿到这个消息做redis的set的操作,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。  3.如果上面两种情况还不行,准备一个第三服务方来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。

  2.如何保证消息的可靠性传输呢?

  其实这个问题是第一个问题的扩展,换而言之,我们要保证可靠性传输,其实就是保证防止生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据而已

  其实这些问题早在中间件开发者已经考虑到了,也提供了一些可配置的文件给我们自行设定相关参数,消息队列一般都会持久化到磁盘这个不用担心,然后生产者数据丢失的话MQ的事务会回滚,可以尝试重新发送,消费者丢的的话一般都是采用了自动确认消息模式导致消费信息被删,只要修改为手动确认就行了,也就是说消费者消费完之后,调用一个MQ的确认方法就行了

  3.如何保证从消息队列里拿到的数据按顺序执行?

  通过算法,将需要保持先后顺序的消息放到同一个消息队列中,然后只用一个消费者去消费该队列。

  (1)rabbitmq:拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点;或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理

  (2)kafka:一个topic,一个partition,一个consumer,内部单线程消费,写N个内存queue,然后N个线程分别消费一个内存queue即可

  4.如何解决消息队列的延时以及过期失效问题?有几百万消息持续积压几小时,怎么解决?

  这个问题是生产环境出现事故后的,考察你如何快速的解决问题,,消息队列的延迟和过期失效是消息队列的自我保护机制,目的是为了防止本身被挤爆,当然是可以关闭保护,比如当某个消息消费失败5次后,就把这个消息丢弃等,尽量不要关掉保护机制,那么问题来了,那些被丢弃的消息难道就不要了吗?其实并不是,我们可以针对该业务,查询出来将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入mq里面去,把丢的数据给他补回来。

  5.数据是通过push还是pull方式给到消费端,各自有什么弊端?

Push模型实时性好,但是因为状态维护等问题,难以应用到消息中间件的实践中,因为在Broker端需要维护Consumer的状态,不好适用于Broker去支持大量的Consumer的场景Consumer的消费速度是不一致的,Broker进行推送难以处理不同的Consumer的状况Broker难以应对Consumer无法消费消息的情况,因为不知道Consumer的宕机是短暂的还是永久的)另外推送消息(量可能会很大)也会加重Consumer的负载或者压垮Consumer。

如果对应只有1个Consumer,用push比pull好。Pull模式实现起来会相对简单一些,但是实时性取决于轮训的频率,在对实时性要求高的场景不适合使用。

如何使用MQ(以ActiveQM为例)

  附上官网:http://activemq.apache.org/

  附上启动服务访问地址:http://127.0.0.1:8161/admin/ 用户名/密码 admin/admin

  附上代码,jar包自己下 https://pan.baidu.com/s/1SUBoypW-w--KeFjHsOtg

  发布订阅模式

  生产者-发布

public class JMSProducer {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
    private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
    private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
    private static final int SENDNUM=10; // 发送的消息数量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void main(String[] args) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        ConnectionFactory connectionFactory; // 连接工厂
        Connection connection = null; // 连接
        Session session; // 会话 接受或者发送消息的线程
        Destination destination; // 消息的目的地
        MessageProducer messageProducer; // 消息生产者
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 实例化连接工厂
        connectionFactory=new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        try {
            connection=connectionFactory.createConnection(); // 通过连接工厂获取连接
            connection.start(); // 启动连接
            session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 创建Session
            // destination=session.createQueue("FirstQueue1"); // 创建消息队列
            destination=session.createTopic("FirstTopic1");
            messageProducer=session.createProducer(destination); // 创建消息生产者
            sendMessage(session, messageProducer); // 发送消息
            session.commit();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            if(connection!=null){
                try {
                    connection.close();
                } catch (JMSException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 发送消息
     * @param session
     * @param messageProducer
     * @throws Exception
     */
    public static void sendMessage(Session session,MessageProducer messageProducer)throws Exception{
        for(int i=0;i<JMSProducer.SENDNUM;i  ){
            TextMessage message=session.createTextMessage("ActiveMQ 发送的消息" i);
            System.out.println("发送消息:" "ActiveMQ 发布的消息" i);
            messageProducer.send(message);
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    消费者-订阅

/**

  • 消息监听-订阅者一
  • @author Administrator * */ public class Listener implements MessageListener{
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Override
    public void onMessage(Message message) {
        // TODO Auto-generated method stub
        try {
            System.out.println("订阅者一收到的消息:" ((TextMessage)message).getText());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

public class JMSConsumer {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
    private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
    private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void main(String[] args) {
        ConnectionFactory connectionFactory; // 连接工厂
        Connection connection = null; // 连接
        Session session; // 会话 接受或者发送消息的线程
        Destination destination; // 消息的目的地
        MessageConsumer messageConsumer; // 消息的消费者
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 实例化连接工厂
        connectionFactory=new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer.BROKEURL);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        try {
            connection=connectionFactory.createConnection();  // 通过连接工厂获取连接
            connection.start(); // 启动连接
            session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建Session
            // destination=session.createQueue("FirstQueue1");  // 创建连接的消息队列
            destination=session.createTopic("FirstTopic1");
            messageConsumer=session.createConsumer(destination); // 创建消息消费者
            messageConsumer.setMessageListener(new Listener()); // 注册消息监听
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}

  end

  by the way

  我认为一个优秀的分布式消息队列,应该具备以下的能力:高吞吐、低时延(因场景而异),传输透明,伸缩性强,有冗灾能力,一致性顺序投递,同步 异步的发送方式,完善的运维和监控工具和开源

作者:卓庆森出处:https://www.cnblogs.com/zhuoqingsen/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点。
程序猿小亮
2021/01/29
4140
【中间件】ActiveMQ的queue以及topic消息处理机制浅析
Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。
Luga Lee
2022/03/25
6830
【中间件】ActiveMQ的queue以及topic消息处理机制浅析
JMS--ActiveMQ的简单使用
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有 Producer(生产者)、Consumer(消费者)。消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
宋先生
2019/07/18
1.1K0
ActiveMQ消息队列的使用及应用
ActiveMQ消息队列的使用及应用 这里就不说怎么安装了,直接解压出来就行了。 谢绝转载,作者保留所有权力 目录: 复制代码 一:JMQ的两种消息模式 1.1:点对点的消息模式 1.2:订阅模式 二:点对点的实现代码 2.1:点对点的发送端 2.2:点对点的接收端 三:订阅/发布模式的实现代码 3.1:订阅模式的发送端 3.2:订阅模式的接收端 四:发送消息的数据类型 4.1:传递javabean对象 4.2:发送文件 五:ActiveMQ的应用 5.1:保证消息的成功处理 5.2:避免消息队列的并发 5
企鹅号小编
2018/02/01
1.5K1
消息队列中间件(二)使用 ActiveMQ
Active MQ 是由 Apache 出品的一款流行的功能强大的开源消息中间件,它速度快,支持跨语言的客户端,具有易于使用的企业集成模式和许多的高级功能,同时完全支持 JSM1.1 和 J2EE1.4 。
未读代码
2019/11/04
1.7K0
消息队列中间件(二)使用 ActiveMQ
深入了解ActiveMQ!
某一天,系统B的负责人告诉系统A的负责人,现在系统B的SystemBNeed2do(String userId)这个接口不再使用了,让系统A别去调它了。 于是,系统A的负责人说"好的,那我就不调用你了。",于是就把调用系统B接口的代码给删掉了。代码变成这样了:
JAVA日知录
2020/09/08
1.1K0
深入了解ActiveMQ!
ActiveMQ专题2: 持久化
​ 前面一篇AMQ专题中,我们发现对于Topic这种类型的消息,即使将deliveryMode设置为持久化,只要生产者在消费者之前启动。消息生产者发布的消息还是会丢失。这是符合JMS规范的。 当然,作为一个如此活跃的开源消息中间件,在实现JMS基本规范之后,必然会通过扩展的方式来实现Topic的持久化订阅。 而所谓的deliveryMode持久化和订阅持久化还是两个不同的概念。本篇博客我们就通过实例来一探究竟。
SecondWorld
2018/10/08
7090
ActiveMQ专题2: 持久化
再次研究消息队列记的笔记——activemq
在一个事务正在进行的同时,发出消息给其他的业务,如果消息发送失败,或者消息的执行失败,则回滚消息,重复执行,反复执行失败后,记录失败信息,后期补充性的处理;在消息系统中开启事务,消息的事务是指,保证消息被正常消费,否则回滚的一种机制
全栈程序员站长
2022/06/30
3800
再次研究消息队列记的笔记——activemq
这次真的忽略了一些ActiveMQ内心的娇艳
首先ActiveMQ有俩种消息队列模式:点对点和发布订阅,这俩种都有不可替代的应用场景,前者适用于消息唯一传递的业务,后者适用于分布式环境下进行多面数据同步的操作。 其次一些关于它的官方简介和安装步骤我就不占博客园数据库的内存了,写了也没啥鸟用,用烂的朋友想要提取点儿精华,没接触过的朋友请先安装一个玩玩点对点和发布订阅模式吧(http://www.cnblogs.com/1315925303zxz/p/6377551.html),理解一下这俩种机制的区别和出现消息临界值时的特性,我下面也放一些我前期用于测
赵小忠
2018/01/24
1.2K1
ActiveMQ专题1: 入门实例
​ 从上面的代码可以看出,生产者和消费者的处理流程大致相同。存在很多重复代码,不难发现可以抽取出公共的代码来使得代码更加简洁。
SecondWorld
2018/10/08
3510
ActiveMQ专题1: 入门实例
消息队列(MQ)入门-activemq,rocketmq代码级别
1、从官网下载apache-activemq-5.15.3-bin.zip并解压;
JQ实验室
2022/02/09
1K0
消息队列(MQ)入门-activemq,rocketmq代码级别
线程池与mq的简单结合使用
大家好,又见面了,我是你们的朋友全栈君。本文考虑发送方和接收方有多个线程发布消息和多个线程接收消息的情况:
全栈程序员站长
2022/08/05
1K0
进入消息传递的魔法之门:ActiveMQ原理与使用详解
嗨,亲爱的童鞋们!欢迎来到这个充满魔法的世界,今天我们将一同揭开消息中间件ActiveMQ的神秘面纱。如果你是一个对编程稍有兴趣,但又对消息中间件一知半解的小白,不要害怕,我将用最简单、最友好的语言为你呈现ActiveMQ的奇妙之旅。
繁依Fanyi
2024/01/29
4161
MQ 系列之 ActiveMQ 基本使用
  activemq-client 通过创建 ConnectionFactory 建立到 ActveMQ 的连接,连接工厂封装了一组连接配置参数,这组参数在配置 ActiveMQ 时已经定义,例如 brokerURL 参数,此参数传入的是 ActiveMQ 服务地址和端口,支持 openwire 协议的默认连接为 tcp://localhost:61616,支持 stomp 协议的默认连接为 tcp://localhost:61613。ActiveMQConnectionFactory 构造方法:   ♞ ActiveMQConnectionFactory();   ♞ ActiveMQConnectionFactory(String brokerURL);   ♞ ActiveMQConnectionFactory(String userName, String password, String brokerURL);   ♞ ActiveMQConnectionFactory(String userName, String password, URI brokerURL);   ♞ ActiveMQConnectionFactory(URI brokerURL);
Demo_Null
2020/09/28
1.4K0
MQ 系列之 ActiveMQ 基本使用
springcloud微服务架构开发实战:分布式消息总线
前面在1.4.2节中强调过,在微服务架构中,经常会使用REST 服务或基于消息的通信机制。
愿天堂没有BUG
2022/10/28
8380
springcloud微服务架构开发实战:分布式消息总线
JMS中间件ActiveMQ详解
Java Message Service(JMS)是SUN提出的旨在统一各种MOM(Message-Oriented Middleware )系统接口的规范,它包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
烂猪皮
2018/08/03
1.6K0
JMS中间件ActiveMQ详解
消息队列——ActiveMQ使用及原理浅析
什么是消息中间件?随着业务的急速增长以及分布式架构的逐渐兴起,首先要考虑的就是如何高效的在各节点之间传递消息,其次要考虑的是流量洪峰时如何削减系统的压力以及跨平台消息的传输等问题,消息中间件就可以帮我们解决以上问题。而消息队列产品众多,我们该如何选择呢?本系列文章主要针对目前使用最多的ActiveMQ、Kafka、RabbitMQ进行讲解说明。
夜勿语
2020/09/07
4.1K0
ActiveMQ点对点消息传递
  上篇文章中详细介绍了ActiveMQ。本文继续介绍ActiveMQ的具体操作 ActiveMQ 处理对象消息 1.定义消息载体对象 /** * Order Bean * 定义消息载体类型. 即要在ActiveMQ中传递的数据实体类型. * 消息载体对象必须实现接口java.io.Serializable, 因为消息需要在网络中传递,要求必须可序列化 * @author dengp * */ public class Order implements Serializable{ priva
用户4919348
2019/04/02
1.3K1
ActiveMQ点对点消息传递
第一章:activeMQ原理,安装,queue,topic以及topic持久化方式介绍,包括修改ubuntu的jdk环境变量。
转载了好几篇关于mq的博文,但是总感觉对mq的理解使用都不到位。这里打算从原理到使用都从头来一遍。
全栈程序员站长
2022/08/05
1.1K0
第一章:activeMQ原理,安装,queue,topic以及topic持久化方式介绍,包括修改ubuntu的jdk环境变量。
五分钟入门消息中间件
众所周知,消息中间件是大型分布式系统中不可或缺的重要组件。它使用简单,却解决了不少难题,比如异步处理,系统耦合,流量削锋,分布式事务管理等。实现了一个高性能,高可用,高扩展的系统。本章通过介绍消息中间件的应用场景,消息中间件的传输模式,ActiveMQ快速入门 三个方面来对消息中间件进行入门介绍。还在等什么,赶快来学习吧!
Bug开发工程师
2018/07/23
1.7K0
五分钟入门消息中间件
相关推荐
深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验