分享

Marco's Java【ActiveMQ入门(一) 之 初识ActiveMQ】

 芥子c1yw3tb42g 2023-11-15 发布于陕西
前言

相信不少朋友听说过消息中间件,并且还使用过,比方说我们之前学习的Redis的list数据结构就可以当作一个消息中间件,其实这个东西也没那么玄乎,说白了就是一个FIFO(First In First Out)队列,类似于一个管道,将消息从入口放进去,然后从出口取出,通过这种方式将杂乱无序的消息堆排列成有序的消息队列,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,使得它可以在分布式环境下扩展进程间的通信。

所以说,消息中间件在分布式系统中就相当于一个 “通道”,或者说是一个 “漏斗”,我们本节开始学习的ActiveMQ就是这个 “大漏斗” 。那么问题来了,“漏斗” 的本质是什么?到底有什么用途?是怎么个工作原理?
带着这些问题,我们接着往下看吧~

什么是ActiveMQ

刚刚我们简单的提到了一下什么是消息中间件,那作为消息中间件的一员,我们还是先来介绍下ActiveMQ吧!

在这里插入图片描述
ActiveMQApache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。
JMS是一组Java应用程序接口,它提供消息的创建、发送、读取等一系列服务。JMS提供了一组公共应用程序接口和响应的语法,类似于Java数据库的统一访问接口JDBC,它是一种与厂商无关的API,使得Java程序能够与不同厂商的消息组件很好地进行通信。

总结起来,ActiveMQ就是一个实现了JMS(Java Message Service)的消息中间件。得益于JMS的跨平台特性,该中间件也可跨平台(javac++python.net都能使用,最近流行的websocketmqtt也能实现),说到JMS就不得不提到下面几个概念,对于后续理解ActiveMQ的工作原理会有帮助。

名词解释
服务提供者实现JMS的消息服务中间件服务器
客户端发送或接受消息的应用
生产者/发布者创建并发送消息的客户端
消费者/订阅者接受并处理消息的客户端
消息应用程序之间传递的数据
消息模式在客户端之间传递消息的模式,JMS主要是队列模式和主题模式

关于生产者和消费者,我们之前在 Marco’s Java【Dubbo 之手写Dubbo框架实现远程调用】 中有专门的提到并分析过,至于消息么,这个很容易理解,就是被传递的数据,我们重点来说说消息模式,JMS的消息模式分为Queue队列模式Topic主题模式,队列模式其实就是点对点的模式,我发一个消息你接收一个消息,而主题模式也可以被当成订阅模式,就好比你订阅了曾小贤的 “你的月亮我的心” 广播电台,那么当曾小贤开始工作并装逼时,所有的订阅者就可以收听到他的广播了。关于点对点和点对面,下面的ActiveMQ名词解释中我们还会提到。


ActiveMQ名词解释

ActiveMQ的部分名词跟上面JMS的名词有些相似,比如说Broker就是上面提到的服务提供者,至于ActiveMQ消息生产者和消息的消费者就完全跟上面的概念一样了,我这里就不再列出来了。

名词解释
BrokerMq服务器,就是安装activmeq 软件的服务器
QueueFIFO(First In First Out)的队列
ConnectionFactory创建连接的连接的地方
Connection使用连接,可以让客户端和服务器建立连接
Session在一次操作里面,要通过会话来访发送的数据,或接受数据

接下来,咱们继续介绍刚刚提到的ActiveMQ中两个比较重要的概念:点对点(Queue模式)、点对面(Topic模式)

点对点

点对点的意思就是,当生产者投递一个消息之后,该消息只能让其中一个消费者获取到,这就好比我们在微信上面聊天,你发信息给你女朋友,这种点对点的方式交流,就是ActiveMQ的 “点对点” 模式。那么结合ActiveMQ的消息模式中的队列模式,可以用下面的图来表示,JMS客户端包括生产者Productor和消费者Consumer,Productor生产的一个message只能被一个Consumer使用,并且在这个模式中Consumer可以在任意时间取消息
在这里插入图片描述

点对面

而点对面的意思就是,当生产者投递一个消息之后,该消息可以让所有的订阅者收到。还是以微信聊天为例,当你发起了群聊,其他的人都可以接受到你发送的信息,因为在群聊被创建之后,这个群里的任意一个成员都是一个生产者,并会被其他成员订阅,这中模式下(Topic模式),JMS客户端包括Publisher发布者和Subscriber订阅者,主题中的消息可以被所有订阅者消费,但是需要注意的是订阅者不能消费订阅之前发送的消息
怎么理解呢?很简单,就好像你加入一个群聊,前一秒群里还在发红包,后一秒你再入群,那么之前发的红包你是领取不到的…
在这里插入图片描述


ActiveMQ的原理和作用

其实,弄清楚了上面的点对点和点对面的两张图,ActiveMQ的原理也就差不多可以懂了,生产者可能在不同的主机上,并且作为消息的生产方,并发产生的消息数量可能是成千上万的,就好比雨滴洒下来,没有任何规律,有快有慢,而ActiveMQ则作为一个引流的管道,将消息都收集起来,消费者取消息就完事儿了,在高并发的情况下,根本不用再去考虑我哪个消费者该消费哪个消息。
在这里插入图片描述

消息队列实现异步

这可以给我们带来怎样的启发呢?比如说我这里有两个项目,一个productor项目和一个consumer项目
在这里插入图片描述
我这里使用Redis中的list来模拟队列,假设现在有一个增添商品的服务,且并发量特别高,按照以往的方式我们可能会一个个的去添加,添加完了再给客户反馈,在增加的时候,中间肯定会有等待的过程(虽然时间会很短),那么此时线程肯定会被阻塞,但是怎么让客户在添加商品之后立马收到一条 “商品已添加” 的消息呢?
其实我们可以利用这种队列的特性,将需要添加的商品的数据放入消息管道中,接着我们再开启另外一个consumer项目,单独运行一个进程,去消费消息管道中的数据,专注做一件事情!这样处理的效率是不是很高?
在这里插入图片描述
其实这就是使用消息中间件实现异步操作的很好的栗子。当然了类似于ActiveMQ的中间件的作用绝不仅如此。合理使用ActiveMQ还可以完成以下功能。

流量削峰

比如说某宝网站用户在双十一的不同的时间段下单量不均匀,00:00时有10w的下单量,00:20有8w的下单量,01:00时有5w的下单量… 那么这种情况怎么因对呢?如何去中和这几个时间点的处理数据的速率是个关键点,此时我们使用ActiveMQ就可以完成这个操作,通过将大量的数据置入消息队列中,然后由后台的消费者去消费队列中的消息(真正的下单操作在这里执行),这就是所谓的流量削峰。
在这里插入图片描述
削峰从本质上来说就是更多地延缓用户请求,以及层层过滤用户的访问需求,遵从“最后落地到数据库的请求数要尽量少”的原则。消息队列就像“水库”一样,拦蓄上游的洪水,削减进入下游河道的洪峰流量,从而达到减免洪水灾害的目的。

软总线

软总线这个概念最近也比较火,主要是华为的 “鸿蒙” 系统腾空出世,说的很玄乎,其实软总线本质上也是一个消息中间件,通过远程调用实现进程间的通信,最终实现进程的内存共享,它可以用于多个微内核之间的通信。
利用ActiveMQ就可以实现一个软总线,将所有的内核连接在上软总线上,每个内核都能向mq里面发送消息,并且读取消息,内核与内核之间运作在不同的进程中,所以说软总线可以算作是一个通信器了(在Spring Cloud 中的spring cloud bus本质就是软总线的概念,不过我们称之为消息总线)。
在这里插入图片描述

物联网

说到物联网,可能还有的朋友会比较陌生,但是说到这几年流行的共享单车,大家肯定不会陌生了,物联网的思想其实就是通过网络让万物互联,而让万物互联的条件就是网络一定要好!因为万物互联时代,如果网络通信不好,那就无法顺利的获取 “物” 所发送的信号,现在5G的横空出世,其实很大程度上解决了这个问题,因此,物联网以及人工智能在未来的10年肯定是个发展趋势,这是毋庸置疑的!
好啦,回归正题,在物联网中ActiveMQ也是扮演着消息通信的角色,每个共享单车上其实都安装着网络装置,当我们扫码的时候,单车上的物联网络设备会通过mqtt://协议发送请求到ActiveMQ,由后台分析请求,最终返回结果给消息中间件,由消息中间件发送最终的结果(消息)给共享单车,进而实现开锁。并且单车的行车轨迹也会实时的发送到消息队列中,并由后台计算并存储。
在这里插入图片描述


ActiveMQ的安装

好啦,ActiveMQ就先介绍到这里,接下来我们来安装ActiveMQ以及运行它,安装步骤也非常的简单
第一步:新建文件夹

cd /usr/local
mkdir mq

第二步:下载压缩包
登录到ActiveMQ的官网,下载安装包,下载地址请戳 ActiveMQ Download,记得下载tar.gz的包,当然,在linux中使用以下指令也可以。

wget https://mirrors.tuna./apache//activemq/5.15.9/apache-activemq-5.15.9-bin.tar.gz

第三步:解压文件

tar -zxvf apache-activemq-5.15.9-bin.tar.gz

解压之后,查看ActiveMQ的目录结构,同样的,bin就是存放二进制可执行文件的目录,conf则存放配置文件,data是存放数据的文件夹(ActiveMQ默认存储数据的方式是kahadb,后面会讲到),docs存放的是一些文档,lib存放的是依赖jar包,webapps中存放web应用,可见ActiveMQ肯定是有一个可视化页面的,ActiveMQ中的web项目是运行在Jetty里面的,Jetty和Tomcat 一样也是web 容器(Solr 也用的是Jetty)。论服务器性能,还是Tomcat略胜一筹,至于为什么ActiveMQ要用Jetty,据说是ActiveMQ横空出世的那一年,Google当时也在使用Jetty,所以就用上了…
在这里插入图片描述
第四步:运行ActiveMQ
没错,解压完之后就可以运行了,非常简单对吧,和其他的分布式使用的应用一样,启动指令无非就是./xxxx start,其他的停止,重启等等操作,就不需要我解释了吧。

./activemq start|stop|restart|status

启动完成之后,访问http://ip:8161/就可以啦!
在这里插入图片描述


ActiveMQ的可视化页面

在这里插入图片描述
大家留意这个页面最上边的选择列表,Queues就是队列模式中心,Topics就是主题模式中心,Subscribers是订阅者中心,Connections是连接中心,Network负责管理网络,Scheduled是处理日程的,一般用来做消息的定时任务,比方说我们在某宝上购买某商品,但是没有付款,那么此时这个订单就会进入Scheduled,过了30min如果还没有付款,这个订单就被被取消,并且ActiveMQ会发送消息到后台数据库,使用逻辑删除来remove这个订单数据。

接下来点开Queues的管理中心
在这里插入图片描述
Topic的结构和Queues是一样的,这里就不重复介绍啦,接下来我们看看Send消息发送中心
在这里插入图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多