消息隊列----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

服務器和插件的各類設置的配置方式一、配置文件二、環境變量三、最常配置的核心服務器設置四、故障排除:如何驗證配置文件的位置和有效的配置

相關文章
相關標籤/搜索