今天学习了关于MQ的一些知识,把内容总结下,理解可能有些错误,以后逐步改进。
1.什么是MQ,为什么要使用MQ?
http://blog.sina.com.cn/s/blog_6166d8170100h0ty.html
简单点说:MQ即消息队列,那么提到消息就会提出一些:谁发出消息,谁接收消息?消息的发送方和接收方是怎么进行连接的,是怎么获取对应的消息的?对于这种模式应用在什么需求之上?等等这一系列的问题。
现在很多项目都是分布式的系统,这些系统是逻辑上集中维护整个系统,物理上分离。也就是说一个大的系统是有多个子系统来构成的,那么这些子系统直接如何进行通信呢?如何进行跨域互相访问呢?我们知道有HttpClient,有jsonp这些工具。那么MQ的作用是什么呢?其实MQ我们可以称之为一个中间件,也是为了提供应用程序与应用程序间的通信的。
对于前面说的谁发出消息:我们成为消息的生产者。谁接收消息:我们成为消息的消费者。生产者发送消息到队列,然后消费者从队列中获取消息。这就是MQ的主要模式。
使用MQ的好处有哪些呢?
它有效的降低了应用程序的之间的耦合度,有效解决分布式系统中的数据同步的难题。
关于数据同步:举个例子:比如我们信息缓存到了Redis中,但是我们这个信息在数据库进行了修改,那么,Redis中的数据如何进行更新呢。 对于这个问题的核心思想:就是将Redis中的key删除。重新将数据放入缓存。
方案一:之前的一种解决方案:我们写一个同步数据的接口,然后供后台调用来实现数据的同步。
我们分析这个方案一的优缺点:优点:实现了数据的同步。缺点是:关于信息的增删改都需要调用接口,频繁调用该接口,一个是效率太低,第二是耦合度太高。
(关于耦合度的理解:个人理解就是关联性太强,一处修改,其他地方也要跟着修改)。
方案二:利用MQ来实现数据的同步。这个后面我们会细讲如何实现的。
所以MQ的作用:实现数据的同步,实现系统间的解耦,降低系统间的耦合度。
2、MQ的分类
上面说了MQ,那么MQ有哪些分类呢?
我们可以在开源中国看下:
上面就是MQ的分类,有很多。今天我们主要讲RabbitMQ.
3、什么是RabbitMQ?
RabbitMQ是MQ的一种,是开源的,我们称之为兔子MQ.用来处理应用程序与应用程序直接的通信。
RabbitMQ是用ErLang语言进行开发的,ErLang语言是一种面向并发的动态编程语言,即主要是处理高并发模式的编程。
4、RabbitMQ的安装(windows与linux)
不论是window是还是linux系统我们要使用RabbitMQ,首先我们要创建ErLang的环境才可以,否则是不支持RabbitMQ的。
接下来我们看下如何安装吧:
首先window下的安装:
安装注意事项:将这些注意事项避免了,我们才能顺利安装完成:
3.计算机名必须是英文:
满足了上面四个条件,我们进行下载安装:
下载地址:
下载地址:http://www.rabbitmq.com/download.html
(1)安装Erlang环境:
下载:http://www.erlang.org/download/otp_win64_17.3.exe
这个的安装,都是采用默认的方式,然后直接下一步即可。
(2)安装RabbitMQ
这个也是采用默认的方式,不要修改安装路径,直接下一步。
(3)安装完成后验证是否成功
如何都可以,则表示安装成功。
下面是centos6.5下安装RabbitMQ:
Linux下安装
1.1. 安装Erlang
1.1.1. 添加yum支持
cd /usr/local/src/
mkdir rabbitmq
cd rabbitmq
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc
sudo yum install erlang
1.2. 安装RabbitMQ
上传rabbitmq-server-3.4.1-1.noarch.rpm文件到/usr/local/src/rabbitmq/
安装:
rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm
1.2.1. 启动、停止
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
1.2.2. 设置开机启动
chkconfig rabbitmq-server on
1.2.3. 设置配置文件
cd /etc/rabbitmq
cp /usr/share/doc/rabbitmq-server-3.4.1/rabbitmq.config.example /etc/rabbitmq/
mv rabbitmq.config.example rabbitmq.config
1.2.4. 开启用户远程访问
vi /etc/rabbitmq/rabbitmq.config
注意要去掉后面的逗号。
1.2.5. 开启web界面管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
1.2.6. 防火墙开放15672端口
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save
2. 添加用户
2.1. 用户角色
1、超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2、监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3、策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4、普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
2.2. 创建Virtual Hosts
设置权限:
5、RabbitMQ的模式分类?
说分类之前,我们先说下MQ的端口:
总共有三种:AMOP:这个是一种协议,类似于http协议,而RabbitMQ则是对这种协议的一种实现形式。端口是5672
RabbitMQ:端口是15672(这个仅限于登录RabbitMQ的端口使用)
ClusterMQ:端口是25672(集群中的端口)
在于java项目进行相互的时候我们使用的基于AMOP协议的5672端口。
前三种模式:1、2是不能实现数据同步的。
5、什么是springRabbit?
即springRabbit,有了对底层的封装,我们用起来更方便。下面我们看下具体如何使用。
6、spingRabbit的应用?
首先添加依赖:
(1)生产者:
配置文件+发送消息代码
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <!-- 定义RabbitMQ的连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}" /> <!-- 管理--> <rabbit:admin connection-factory="connectionFactory"/> <!-- 定义交换机 ,auto-declare指定交换机自动声明,自动创建 --> <rabbit:topic-exchange name="TAOTAO-ITEM-EXCHANGE" auto-declare="true" durable="true"> </rabbit:topic-exchange> <!-- 定义一个模板 --> <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="TAOTAO-ITEM-EXCHANGE"></rabbit:template> </beans>
发送消息的代码:
(2)消费者配置+代码
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <!-- 定义RabbitMQ的连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}" /> <!-- 管理--> <rabbit:admin connection-factory="connectionFactory"/> <!-- 这是消费者,消费者需要监听消息队列 --> <rabbit:queue name="TAOTAO-ITEM-EXCHANGE" auto-declare="true" durable="true"></rabbit:queue> <!-- 将定义的消费者加入到bean中 ,即消费者对象,即谁来消费--> <bean id="contentMQHandler" class="com.taotao.mq.handler.ConentMQHandler"></bean> <!-- 监听队列,消费者监听队列 --> <rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener ref="contentMQHandler" method="execute" queue-names="TAOTAO-ITEM-EXCHANGE"/> </rabbit:listener-container> </beans>
代码:
(3)生产者和消费都写完了,是不是两者就可以互相通信呢?答案是否定的。
生产者将消息发送到交换机,消费者绑定消息队列。那么交换机和消息队列还没绑定呢。
对于这个的绑定,有两种方式:一种是java代码绑定,一种是在RabbitMQ的网页上进行操作绑定。
我们推荐使用第二种:方便快捷。
至此,这就是整个队Rabbit的应用。
最后我们讲讲消息的确认:
这个跟我们平时的购物券很像:
有两种模式:第一:自动模式。即领了券就表示确认了,不论你有没有消费
第二:手动模式。即领了券,你必须用了券之后才表示确认。
而在这里,我们可以利用监听队列的设置:true表示自动模式。false表示手动模式。