zoukankan      html  css  js  c++  java
  • RabbitMQ使用

    今天学习了关于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表示手动模式。

  • 相关阅读:
    视图的作用,视图可以更改么?
    数据库事务的四个特性及含义
    mysql 设置隔离级别
    如何避免事务的并发问题?
    事务控制语言(TCL)
    事务的并发问题有哪些?
    事务的隔离级别: 事务并发问题如何发生?
    DDL 语言
    DML 语言
    TRUNCATE、Drop、Delete 的用法
  • 原文地址:https://www.cnblogs.com/fengli9998/p/6783113.html
Copyright © 2011-2022 走看看