消息队列----RabbitMQ

1、RabbitMQ概览html

1.什么是消息队列?java

“消息队列”是在消息的传输过程当中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;若是发送消息时接收者不可用,消息队列会保留消息,直到能够成功地传递它。web

2.为何要使用消息队列?数据库

主要是因为在高并发环境下,因为来不及同步处理,请求每每会发生堵塞。如:大量的insert,update等请求同时到达数据库,致使无数的行锁表锁,因请求会堆积过多,而触发too many connections错误。经过使用消息队列,咱们能够异步处理请求,从而缓解系统的压力。windows

3.RabbitMQ浏览器

   RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。(官网:http://www.rabbitmq.com/)服务器

  RabbitMQ是一个消息代理:它接受并转发消息。并发

4.RabbitMQ的安装(windows平台)异步

  1)先决条件:下载erlang语言环境。version:20.1  (http://www.erlang.org/downloads)ide

        安装完成后,配置E环境变量RLANG_HOME为安装的根目录,并把%ERLANG_HOME%\bin追加到PATH环境变量

  2)下载RabbitMQ 。version:3.6.12(http://www.rabbitmq.com/install-windows.html)

         执行sbin目录下的rabbitmq-server.bat来启动服务,默认端口:5672

    注意:elang 和 RabbitMQ的版本对应要求。

   3)开启管理插件

    Rabbitmq-management 插件提供了用于管理、监控rabbitmq server的http 应用程序接口,基于浏览器的用户界面 和  命令行工具rabbitmqadmin。

    开启rabbitmq管理插件:

    rabbitmq-plugins enable rabbitmq_management

    

  4)启动 rabbitmq 服务,并使用默认用户guest登陆web 用户界面。

    (使用windows系统服务或者rabbit root/sbin/rabbitmq-server.bat启动):

    

    登入

    

    

  5)RabbitMQ  Hello word  之(消息发布)

  本文以JAVA语言为例进行实现。官网提供了PHP、C#、JAVASCRIPT等多种语言的实现代码。

  注:须要引入rabbitmq java client包,Maven仓库信息:groupId: com.rabbitmq   artifactId: amqp-client

package com.example.mq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Sender_1 {

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory=new ConnectionFactory();
        //对于全部的参数,rabbitmq server在本地都有一个合适的默认值
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");
        //可以使用链接字符串代替
        //factory.setUri("amqp://userName:password@hostName:portNumber/virtualHost");
        Connection connection=factory.newConnection();

        //使用链接打开一个通道。Channel能够用于发送、接收信息
        Channel channel=connection.createChannel();


        //生命 一个 Queues用于发送信息。
        String queueName="queue_1";
        channel.queueDeclare(queueName,false,false,false,null);
        String message="Hello world 1!";
        channel.basicPublish("",queueName,null,message.getBytes());
        System.out.println("[x] Sent '"+message+"'");

        channel.close();
        connection.close();
    }
}

    执行消息发布程序,分别以mesaage="Hello world 1!"; mesaage="Hello world 2!";mesaage="Hello world 3!";发送三条消息。

    发送成功后,能够在管理页面看到rabbitmq server 上有一个名为queue_1的消息队列,其中包含三条消息。

    

    也可使用命令查看队列和其包含的消息:rabbitmqctl.bat list_queues

    

  6)RabbitMQ  Hello word  之(消息接收)

package com.example.mq;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.TimeoutException;

public class Receiver_1 {
    private final static String queueName="queue_1";
    public static void main(String [] args) throws IOException, TimeoutException {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("127.0.0.1");
        Connection connection=factory.newConnection();
        Channel channel=connection.createChannel();
        channel.queueDeclare(queueName,false,false,false,null);
        System.out.println("[*]waiting for message .to exit press ctrl+c...");

        Consumer consumer=new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws UnsupportedEncodingException {
                String message =new String(body,"UTF-8");
                System.out.println("[x] Received '"+message+"'");
            }
        };
        channel.basicConsume(queueName,true,consumer);
    }
}

    执行消息接收程序 Receiver_1 ,从消息服务器rabbitmq上接收queue_1队列上的消息。

    

    在控制台看到,分别接收到了前面发送到MQ上的三条消息,而且顺序遵循FIFO的队列模型。

    相应的,管理页面上queue_1消息队列再也不持有消息:

    

 

2、RabbitMQ Server

 RabbitMQ带有默认的内置设置。 能够知足大部分的环境须要。 若是运行良好,那么你可能根本不须要任何配置。 对于全部其余状况,以及生产部署调优查看这里:http://next.rabbitmq.com/production-checklist.html

服务器和插件的各类设置的配置方式一、配置文件二、环境变量三、最常配置的核心服务器设置四、故障排除:如何验证配置文件的位置和有效的配置