学习消息队列之前,我觉得应该先提一个概念,那就是三方的概念。

   先从身边的例子说起。三方首先应该有额一二三,比方说婚姻介绍所,那三方分别是男方,女方,和婚姻介绍所。另外需求都是明确的,不管是男方想找对象,还是女方想找对象,需求都是想找对象,而婚姻介绍所,干的活对固定的,就是给双方提供相同的服务。需求明确了,流程明确了。生活的这个例子解决的就是找对象的问题,这是三方的概念。

  为什么要有三方呢?比方说我是想找对象的男方,我想要找对象,但是我不能去满大街找去吧!暂时把男性解读为需求消费方把。你懂得。而女性是服务的提供方。男女分别算双方,婚介所算是三方。不管是男性还是女性想要找对象都要去一个固定的地方登记。然后双方再联系。

  消息队列也是这个意思,就像好似婚姻介绍所一样。技术上,这样的三方的概念的体现其实还有很多。比方说zookeeper。

 

# # MQ 消息队列

 前边提到了三方的概念,也说了MQ算是婚姻介绍所。另外需要知道的是MQ是一种理念,它是一个三方,但是它是用来存放信息的,从名字上来看,我们也可以看出来,一个是消息,一个是队列,顾名思义也就是在将传递的消息存放在队列中,然后去处理这些消息。

  对于这种理念都有哪些维度的东西是我们需要学习和注意的呢?

 

消息中间件MQ——ActiveMQ (上)_消息队列

 

 消息队列有这样的用途:解耦,削峰,异步

 

# #  MQ 理念的落地 ActiveMQ

 还是需要先了解一些理念

 主题,topic : 这个概念需要理解为是我们生活中的公众号,我订阅了一个公众号,这个公众号就会给我推文章,别人没有订阅就不会接受到推送的消息,不同的公众号就可以理解成不同的主题。

 

# # 学习ActiveMQ 下载地址

  我们的学习最好是可以自己从官网上学习。 

  官网地址:​​http://activemq.apache.org/​

 

# # ActiveMQ 怎么玩

 主要功能:

 

# # 启动ActiveMQ

 从官网下载完 了以后,解压缩以后

消息中间件MQ——ActiveMQ (上)_公众号_02

可以看到这样的目录,然后进到bin目录里边来,

消息中间件MQ——ActiveMQ (上)_公众号_03

 然后再  ./activemq  start   就可以启动了。

消息中间件MQ——ActiveMQ (上)_消息队列_04

  

# # 服务端能够启动以后,我们就要访问客户端

 我的服务是安装在linux服务器上,自己练习用的是一个虚拟机,已经能够保证互通了。

 然后在我的浏览器上 :​​http://192.168.23.100:8161​

消息中间件MQ——ActiveMQ (上)_消息队列_05

 默认的登录用户名和密码都是 admin ,点击上边的管理ActiveMQ代理 ,就可以登录进去了

 

# # JMS 编码总体架构

消息中间件MQ——ActiveMQ (上)_消息队列_06


  其实这块内容就像是 我们之前学习的JDBC一样,都有一个流程。

 

# # JMS开发的基本步骤

消息中间件MQ——ActiveMQ (上)_数据_07

demo

 

生产者的代码,生产信息,放在消息队列中

消息中间件MQ——ActiveMQ (上)_数据_08

消息中间件MQ——ActiveMQ (上)_消息队列_09

 

再看一下消费者的代码

消息中间件MQ——ActiveMQ (上)_公众号_10

消息中间件MQ——ActiveMQ (上)_数据_11

 

对于上边的监听器,我们本来是使用的匿名内部类,还可以使用lambda表达式

消息中间件MQ——ActiveMQ (上)_消息队列_12

 

 # # 队列 和 主题

消息中间件MQ——ActiveMQ (上)_数据_13

  我们可以看到,队列是点对点的消息消费,主题是一对多的消费模式。

  对于消息的消费,对应的是这样的几个情况,先说队列,第一种情况是一个生产者,一个消费者,消息的消费都是不重复的。还有一种情况就是一个生产者去生产,让后放在队列中,多个消费者。保持同样的规则,那就是存放在队列中的消息只能别消费一次,消费完了就没了。举个例子,盘子里边有一个苹果,第一个消费者来了,将苹果拿走了,第二个消费者过来就看不到盘子里边的苹果了。第二个消费者想要吃苹果,就要等有人做好放在盘子里边。同时还有一点需要知道,那就是不能盘子里边有三个苹果,第一个消费者进来了就全拿走,而是进来只能拿一个,这样第二个消费者也有的吃。

 

  对于主题,是这样的,这个队列有很大的不同,因为同一条信息,会同时给多个人消费。前边有说过,就像是订阅公众号,公众号上推了一篇文章,那么这篇文章需要让订阅了这个公众号的所有的人都接受到。那就有了这样的一个问题,如果没有订阅者,那么生产者就没有意义。所以说这个就要求我们在启动的时候,就要先启动订阅这也就是消费者。

 

# # MQ的落地的实现的详细对比  

消息中间件MQ——ActiveMQ (上)_消息队列_14

  这个对比有很多的维度,我红框框出来的分别是 并发量,高可用, 和上手的容易程度。

  ActiveMQ 是中小型企业比较青睐的产品,RocketMQ是阿里的产品,Kafaka 是非常适合大数据体系的产品。

 

# # JMS  (java message server) 组成的四大元素

 消息生产者,消息消费者,消息中间件(MQ的落地产品),消息

 消息由:消息头,消息属性,消息体

 消息头又有几个属性:消息标识,就是id ;消息优先级,是否持久化;设置过期时间;还有就是设置消息的类型,是队列还是主题。

消息体格式:

消息中间件MQ——ActiveMQ (上)_消息队列_15

 

# # 消息的可靠性

  这方面有持久性,事务,签收

  对于非持久化的数据,MQ宕机以后,里边的消息就没了。

  对于队列而言,默认就是持久化的。

 

  事务:对于生产者,只有在commit以后才提交,将消息存放在消息队列中去。

消息中间件MQ——ActiveMQ (上)_公众号_16

 

# # MQ中的事务

从生产者来说,如果开启事务,对于生产的消息如果事务没有提交的话,生产的消息是无法到队列中去的。

从消费者来说,如果开启事务,如果消费了消息,但是事务没有提交,实际上消息是没有被消费掉的。

从事务的角度上去考虑,有很多的问题要我们去考虑,比方说消息的重复消费问题。

 

# # 消息队列的 签收

 其实签收就和我们生活中签收快递是一个意思,只不过这里是签收的是存放在队列中的消息。

消息中间件MQ——ActiveMQ (上)_数据_17

 签收分为自动签收,和手动签收。自动签收呢就是从消息队列中消费完数据以后,消息队列中的数据就已经没了。而手动签收呢个是消费者消费了消息队列中的数据,如果没有签收的话,消息队列中的数据就没有消失。

   有这样的四种情况,没有开启事务,自动签收,一切正常。

                                    没有开启事务,手动签收,如果消费之不手动签收的话,队列中的消息是会被重复消费的。

                                    开启事务,自动签收,事务提交,就一切正常。

                                    开启事务,手动签收,只要事务提交,顺带着就签收了,不会出现重复消费的情况。

 

# # 如果谈消息的可靠性。

  就一定是消息的持久性,事务,签收。保证消息不丢,保证消息不重复消费。

  同时,高可用离不开的就是集群。就是宕机以后的相关操作。

 

# # 消息队列的Broker

  先说Broker是什么:它是ActiveMQ 的服务器实例。做到将MQ嵌入到java程序中

  MQ 也是支持用不同的配置文件来启动的,这就需要我们自爱conf目录下,配置不同的配置文件。

消息中间件MQ——ActiveMQ (上)_数据_18

activemq.xml 就是配置文件

 Broker 主要是作为了解,不用于生产环境。

 

~接下来请看MQ中级部分。