相信不少朋友听说过消息中间件,并且还使用过,比方说我们之前学习的Redis的list数据结构就可以当作一个消息中间件,其实这个东西也没那么玄乎,说白了就是一个FIFO(First In First Out)队列,类似于一个管道,将消息从入口放进去,然后从出口取出,通过这种方式将杂乱无序的消息堆排列成有序的消息队列,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,使得它可以在分布式环境下扩展进程间的通信。
所以说,消息中间件在分布式系统中就相当于一个 “通道”,或者说是一个 “漏斗”,我们本节开始学习的ActiveMQ就是这个 “大漏斗” 。那么问题来了,“漏斗” 的本质是什么?到底有什么用途?是怎么个工作原理?
带着这些问题,我们接着往下看吧~
刚刚我们简单的提到了一下什么是消息中间件,那作为消息中间件的一员,我们还是先来介绍下ActiveMQ吧!
ActiveMQ 是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。
JMS是一组Java应用程序接口,它提供消息的创建、发送、读取等一系列服务。JMS提供了一组公共应用程序接口和响应的语法,类似于Java数据库的统一访问接口JDBC,它是一种与厂商无关的API,使得Java程序能够与不同厂商的消息组件很好地进行通信。
总结起来,ActiveMQ就是一个实现了JMS(Java Message Service)的消息中间件。得益于JMS的跨平台特性,该中间件也可跨平台(java
、c++
、python
、.net
都能使用,最近流行的websocket
、mqtt
也能实现),说到JMS就不得不提到下面几个概念,对于后续理解ActiveMQ的工作原理会有帮助。
名词 | 解释 |
---|---|
服务提供者 | 实现JMS的消息服务中间件服务器 |
客户端 | 发送或接受消息的应用 |
生产者/发布者 | 创建并发送消息的客户端 |
消费者/订阅者 | 接受并处理消息的客户端 |
消息 | 应用程序之间传递的数据 |
消息模式 | 在客户端之间传递消息的模式,JMS主要是队列模式和主题模式 |
关于生产者和消费者,我们之前在 Marco’s Java【Dubbo 之手写Dubbo框架实现远程调用】 中有专门的提到并分析过,至于消息么,这个很容易理解,就是被传递的数据,我们重点来说说消息模式,JMS的消息模式分为Queue队列模式和Topic主题模式,队列模式其实就是点对点的模式,我发一个消息你接收一个消息,而主题模式也可以被当成订阅模式,就好比你订阅了曾小贤的 “你的月亮我的心” 广播电台,那么当曾小贤开始工作并装逼时,所有的订阅者就可以收听到他的广播了。关于点对点和点对面,下面的ActiveMQ名词解释中我们还会提到。
ActiveMQ的部分名词跟上面JMS的名词有些相似,比如说Broker就是上面提到的服务提供者,至于ActiveMQ消息生产者和消息的消费者就完全跟上面的概念一样了,我这里就不再列出来了。
名词 | 解释 |
---|---|
Broker | Mq服务器,就是安装activmeq 软件的服务器 |
Queue | FIFO(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则作为一个引流的管道,将消息都收集起来,消费者取消息就完事儿了,在高并发的情况下,根本不用再去考虑我哪个消费者该消费哪个消息。
这可以给我们带来怎样的启发呢?比如说我这里有两个项目,一个productor项目和一个consumer项目
比如说某宝网站用户在双十一的不同的时间段下单量不均匀,00:00时有10w的下单量,00:20有8w的下单量,01:00时有5w的下单量… 那么这种情况怎么因对呢?如何去中和这几个时间点的处理数据的速率是个关键点,此时我们使用ActiveMQ就可以完成这个操作,通过将大量的数据置入消息队列中,然后由后台的消费者去消费队列中的消息(真正的下单操作在这里执行),这就是所谓的流量削峰。
软总线这个概念最近也比较火,主要是华为的 “鸿蒙” 系统腾空出世,说的很玄乎,其实软总线本质上也是一个消息中间件,通过远程调用实现进程间的通信,最终实现进程的内存共享,它可以用于多个微内核之间的通信。
利用ActiveMQ就可以实现一个软总线,将所有的内核连接在上软总线上,每个内核都能向mq里面发送消息,并且读取消息,内核与内核之间运作在不同的进程中,所以说软总线可以算作是一个通信器了(在Spring Cloud 中的spring cloud bus本质就是软总线的概念,不过我们称之为消息总线)。
说到物联网,可能还有的朋友会比较陌生,但是说到这几年流行的共享单车,大家肯定不会陌生了,物联网的思想其实就是通过网络让万物互联,而让万物互联的条件就是网络一定要好!因为万物互联时代,如果网络通信不好,那就无法顺利的获取 “物” 所发送的信号,现在5G的横空出世,其实很大程度上解决了这个问题,因此,物联网以及人工智能在未来的10年肯定是个发展趋势,这是毋庸置疑的!
好啦,回归正题,在物联网中ActiveMQ也是扮演着消息通信的角色,每个共享单车上其实都安装着网络装置,当我们扫码的时候,单车上的物联网络设备会通过mqtt://
协议发送请求到ActiveMQ,由后台分析请求,最终返回结果给消息中间件,由消息中间件发送最终的结果(消息)给共享单车,进而实现开锁。并且单车的行车轨迹也会实时的发送到消息队列中,并由后台计算并存储。
好啦,ActiveMQ就先介绍到这里,接下来我们来安装ActiveMQ以及运行它,安装步骤也非常的简单
第一步:新建文件夹
cd /usr/local
mkdir mq
第二步:下载压缩包
登录到ActiveMQ的官网,下载安装包,下载地址请戳 ActiveMQ Download,记得下载tar.gz
的包,当然,在linux中使用以下指令也可以。
wget https://mirrors.tuna.tsinghua.edu.cn/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,所以就用上了…
./xxxx start
,其他的停止,重启等等操作,就不需要我解释了吧。
./activemq start|stop|restart|status
启动完成之后,访问http://ip:8161/
就可以啦!
接下来点开Queues的管理中心
联系客服