1,什么是RabbitMq

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

百度百科 ,RabbitMQ 官网  AMQP 协议

2,几种MQ对比

RabbitMQ 是用Erlang 语言进行开发的,一款设计之初就是抗高并发的语言

3,RabbitMQ 安装

1.下载并安装erlang,下载地址:http://www.erlang.org/download
2.配置erlang环境变量信息
新增环境变量ERLANG_HOME=erlang的安装地址
将%ERLANG_HOME%\bin加入到path中
3.下载并安装RabbitMQ,下载地址:http://www.rabbitmq.com/download.html 注意: RabbitMQ 它依赖于Erlang,需要先安装Erlang。

RabbitMQ 管理平台地址 http://127.0.0.1:15672

默认账号:guest/guest 用户可以自己创建新的账号

 

https://blog.csdn.net/qq_35098526/article/details/80009424 安装之后启动不了,可以在sbin 里面:

输入:rabbitmq-plugins enable rabbitmq_management  (先定位到rabbitmq安装目录)命令,出现plugins安装成功的提示。

过程:

Microsoft Windows [Version 10.0.17134.950]
C:\Program Files\RabbitMQ Server>
C:\Program Files\RabbitMQ Server>cd rabbitmq_server-3.7.
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.>cd sbin
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.\sbin>rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@DESKTOP-2MDM24J:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@DESKTOP-2MDM24J...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch started plugins.

4,RabbitMQ 五种队列形式

    1.点对点队列,也可以叫做简单队列

生产者投递的消息,每次只准一个消费者来消费,如果消费者集群的话,消息会被均摊。

例如:50 个消息,2个消费者,消费者1会消费奇数,消费者2会消费偶数,两个消费者不受影响,各自消费各自的消息

producer:

public class Producer {

    private static final String QUEUE_NAME = "rabbitmq_simple_queue_one";

    public static void main(String[] args) throws IOException, TimeoutException {

        Connection connection = MQConnectionUtils.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 3.创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
for (int i = 0; i < 50; i++) {
String msg = "Hello, World :" + i;
System.out.println(msg);
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
}
channel.close();
connection.close();
} }

consumer1:

public class Consumer {

    private static final String QUEUE_NAME = "rabbitmq_simple_queue_one";

    public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("consumer1");
Connection connection = MQConnectionUtils.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 3.创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println("消费者获取消息:" + msgString);
}
};
// 3.监听队列
channel.basicConsume(QUEUE_NAME, true, consumer); //true 代表采用自动签收的应答模式
} }

consumer2:

public class Consumer2 {

    private static final String QUEUE_NAME = "rabbitmq_simple_queue_one";

    public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("consumer2");
Connection connection = MQConnectionUtils.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 3.创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println("消费者获取消息:" + msgString);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// 3.监听队列
channel.basicConsume(QUEUE_NAME, true, consumer); //true 代表采用自动签收的应答模式
} }

  2,工作队列模式,也可以叫做公平队列模式

点对点简单队列弊端:消费者集群的话,消息会被均摊处理,但是不同的消费者处理消息的能力是不同的,consumer1 每秒处理1个消息,consumer2 美妙处理3个消息,如果消息均摊,consumer1的效率则被浪费。

公平消费模式:谁处理的快,并且采用手动签收,告知RabbitMQ之后,RabbitMQ 再给分发消息。这样,谁处理的快,谁就会处理的多。

producer:

public class Producer {
// 公平队列名称
private static final String QUEUE_NAME = "rabbitmq_fair_queue_one"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = MQConnectionUtils.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 保证消费者只能取一个/每次
channel.basicQos(1); //每次只给消费者1条消息,等消费完成,手动ack 应答之后,再给下一条
for (int i = 0; i < 50; i++) {
String msg = "Hello, World: " + i;
System.out.println(msg);
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
}
channel.close();
connection.close(); } }

consumer1:

public class Consumer {

    private static final String QUEUE_NAME = "rabbitmq_fair_queue_one";

    public static void main(String[] args) throws IOException, TimeoutException {

        System.out.println("consumer01");
Connection connection = MQConnectionUtils.getConnection();
// 创建通道
final Channel channel = connection.createChannel();
// 3.创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null); channel.basicQos(1); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println("消费者获取消息:" + msgString);
try {
Thread.sleep(200);
} catch (Exception e) {
} finally {
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};
// 3.监听队列
channel.basicConsume(QUEUE_NAME, false, consumer); //false 代表使用手动消息应答,需要使用channel.basicAck(envelope.getDeliveryTag(),false) 告知消息中间件
} }

consumer2:

public class Consumer2 {

    private static final String QUEUE_NAME = "rabbitmq_fair_queue_one";

    public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("consumer02");
Connection connection = MQConnectionUtils.getConnection();
// 创建通道
final Channel channel = connection.createChannel();
// 3.创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null); channel.basicQos(1); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println("消费者获取消息:" + msgString);
try {
Thread.sleep(); //让这个消费者处理消息的能力更差一点
} catch (Exception e) {
} finally {
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};
// 3.监听队列
channel.basicConsume(QUEUE_NAME, false, consumer);
} }

   3,发布订阅模式,采用fanout 扇形交换机,

高级队列模式中,有交换机,生产者将消息发给交换机,在根据交换机的类型,发给定的的队列,然后发给指定的消费者消费

producer:

public class Producer {

    // 定义交换机名称
private static final String EXCHANGE_NAME = "rabbitmq_pubsub_exchanger_one";
// 定义交换机类型
private static final String EXCHANGE_TYPE = "fanout"; public static void main(String[] args) throws IOException, TimeoutException {
// 和rabbitmq 建立连接
Connection connection = MQConnectionUtils.getConnection();
// 创建channel
Channel channel = connection.createChannel();
// 创建交换机
channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE); String message = "pub/sub"; channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes()); channel.close(); connection.close(); } }

邮件消费者:

ublic class EmailConsumer {

    private static final String QUEUE_NAME = "rabbitmq_pubsub_email_queue_one";
private static final String EXCHANGE_NAME = "rabbitmq_pubsub_exchanger_one"; public static void main(String[] args) throws IOException, TimeoutException { System.out.println("邮件消费者。。。"); Connection connection = MQConnectionUtils.getConnection(); Channel channel = connection.createChannel();
// 定义队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 将队列和交换机进行绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息 :" + msg);
}
};
// 消费者监听队列消息 true 代表自动签收
channel.basicConsume(QUEUE_NAME, true, consumer);
} }

短信消费者:

// 信息消费者
public class TextConsumer {
private static final String QUEUE_NAME = "rabbitmq_pubsub_text_queue_one";
private static final String EXCHANGE_NAME = "rabbitmq_pubsub_exchanger_one"; public static void main(String[] args) throws IOException, TimeoutException { System.out.println("短信消费者。。。");
Connection connection = MQConnectionUtils.getConnection(); Channel channel = connection.createChannel();
// 定义队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 将队列和交换机进行绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息 :" + msg);
}
};
// 消费者监听队列消息 true 代表自动签收
channel.basicConsume(QUEUE_NAME, true, consumer);
} }

4,路由模式:采用direct 交换机

producer:

public class Producer {
// 定义交换机名称
private static final String EXCHANGE_NAME = "rabbitmq_direct_exchanger_one";
// 定义交换机类型
private static final String EXCHANGE_TYPE = "direct";
// 定义路由
private static final String ROUTINGKEY = "info";
public static void main(String[] args) throws IOException, TimeoutException {
// 和rabbitmq 建立连接
Connection connection = MQConnectionUtils.getConnection();
// 创建channel
Channel channel = connection.createChannel();
// 创建交换机
channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE); String message = "pub/sub"; channel.basicPublish(EXCHANGE_NAME, ROUTINGKEY, null, message.getBytes()); channel.close(); connection.close(); } }

邮件消费者:

public class EmailConsumer {

    private static final String QUEUE_NAME = "rabbitmq_direct_email_queue_one";
private static final String EXCHANGE_NAME = "rabbitmq_direct_exchanger_one";
private static final String ROUTINGKEY_INFO = "info"; public static void main(String[] args) throws IOException, TimeoutException { System.out.println("邮件消费者。。。"); Connection connection = MQConnectionUtils.getConnection(); Channel channel = connection.createChannel();
// 定义队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 将队列和交换机进行绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTINGKEY_INFO); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息 :" + msg);
}
};
// 消费者监听队列消息 true 代表自动签收
channel.basicConsume(QUEUE_NAME, true, consumer);
} }

短信消费者:

public class TextConsumer {
private static final String QUEUE_NAME = "rabbitmq_direct_text_queue_one";
private static final String EXCHANGE_NAME = "rabbitmq_direct_exchanger_one";
// 设定路由
private static final String ROUTINGKEY_INFO = "info";
private static final String ROUTINGKEY_WARN = "warn";
public static void main(String[] args) throws IOException, TimeoutException { System.out.println("短信消费者。。。");
Connection connection = MQConnectionUtils.getConnection(); Channel channel = connection.createChannel();
// 定义队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 将队列和交换机进行绑定 绑定路由
//info 和 warn 路由的都能接收到
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTINGKEY_INFO); channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTINGKEY_WARN); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息 :" + msg);
}
};
// 消费者监听队列消息 true 代表自动签收
channel.basicConsume(QUEUE_NAME, true, consumer);
} }

5,通配符模式,采用topic 交换机  # 代表任意 * 代表一个

producer:

public class Producer {

    // 定义交换机名称
private static final String EXCHANGE_NAME = "rabbitmq_topic_exchanger_one";
// 定义交换机类型
private static final String EXCHANGE_TYPE = "topic";
// 定义路由
private static final String ROUTINGKEY = "routingkey.info.error.warn";
public static void main(String[] args) throws IOException, TimeoutException {
// 和rabbitmq 建立连接
Connection connection = MQConnectionUtils.getConnection();
// 创建channel
Channel channel = connection.createChannel();
// 创建交换机
channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE); String message = "pub/sub"; channel.basicPublish(EXCHANGE_NAME, ROUTINGKEY, null, message.getBytes()); channel.close(); connection.close(); } }

邮件消费者:

public class EmailConsumer {

    private static final String QUEUE_NAME = "rabbitmq_topic_email_queue_one";
private static final String EXCHANGE_NAME = "rabbitmq_topic_exchanger_one";
private static final String ROUTINGKEY = "routingkey.#"; public static void main(String[] args) throws IOException, TimeoutException { System.out.println("邮件消费者。。。"); Connection connection = MQConnectionUtils.getConnection(); Channel channel = connection.createChannel();
// 定义队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 将队列和交换机进行绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTINGKEY); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息 :" + msg);
}
};
// 消费者监听队列消息 true 代表自动签收
channel.basicConsume(QUEUE_NAME, true, consumer);
} }

短信消费者:

public class TextConsumer {
private static final String QUEUE_NAME = "rabbitmq_topic_text_queue_one";
private static final String EXCHANGE_NAME = "rabbitmq_topic_exchanger_one";
private static final String ROUTINGKEY = "routingkey.info.*";
// 设定路由 public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("短信消费者。。。");
Connection connection = MQConnectionUtils.getConnection(); Channel channel = connection.createChannel();
// 定义队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 将队列和交换机进行绑定 绑定路由
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTINGKEY); DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费者获取生产者消息 :" + msg);
}
};
// 消费者监听队列消息 true 代表自动签收
channel.basicConsume(QUEUE_NAME, true, consumer);
} }

     

高性能RabbitMQ的更多相关文章

  1. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  2. .Net使用RabbitMQ详解

    序言 这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其中,就把他抛开,我们只谈消息Rabbi ...

  3. springboot(八):RabbitMQ详解

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...

  4. RabbitMQ 高可用集群搭建及电商平台使用经验总结

    面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...

  5. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  6. 基于Netty与RabbitMQ的消息服务

    Netty作为一个高性能的异步网络开发框架,可以作为各种服务的开发框架. 前段时间的一个项目涉及到硬件设备实时数据的采集,采用Netty作为采集服务的实现框架,同时使用RabbitMQ作为采集服务和各 ...

  7. 缓存、队列(Memcached,Redis,rabbitMQ)

    一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...

  8. 网易蜂巢微服务架构:用RabbitMQ实现轻量级通信

    本次分享内容由三个部分组成: 微服务架构与MQ RabbitMQ场景分析与优化 RabbitMQ在网易蜂巢中的应用和案例分享 1微服务架构与MQ 微服务架构是一种架构模式,它将单体应用划分成一组微小的 ...

  9. 消息中间件:RabbitMQ基本探索

    RabbitMQ是一个基于AMQP协议(Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中 ...

随机推荐

  1. Java基础:浅谈数据输入流/数据输出流《DataInputstream类与DataOutputstream类》

     一.理论概述 数据输入/输出流(DataInputStream类与DataOutputStream类) 允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型. 说白了就是,当读取一个 ...

  2. iOS开发日常笔记01

    为什么有initWithCoder还要awakeFromNib? awakeFromNib相较于initWithCoder的优势是:当awakeFromNib执行的时候,各种IBOutlet也都连接好 ...

  3. @JsonFormat、@DateTimeFormat注解,读取数据库晚一天问题

    @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss&qu ...

  4. Mac中使用brew安装mysql

    若不考虑版本直接执行以下命令 brew install mysql 若要选择版本只要加上@版本即可,例如 brew install mysql@5.7 安装完后启动mysql mysql.server ...

  5. 利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”

    Linux:CentOS7 python: 系统默认python版本2.7,利用python启动 自己安装python版本3.8,利用python3启动 问题描述: 在上述环境中利用virtualen ...

  6. 把.net Core 项目迁移到VS2019 for MAC

    VS2019 for MAC已经发布很长时间了,本以为项目移过去很麻烦,一直没有动作,最近呆家里快发霉了,决定研究研究,没想到一句代码都不需要动,直接完功,这下可以生产了.同学们可以放心整了. 本次平 ...

  7. 峰哥说技术:10-Spring Boot静态资源处理

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 10  峰哥说技术:Spring Boot静态资源处理 今天我们聊聊关于 Spring Boot 中关于静 ...

  8. java 发送邮件详细讲解

    一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...

  9. 机器学习实用案例解析(1) 使用R语言

    简介 统计学一直在研究如何从数据中得到可解释的东西,而机器学习则关注如何将数据变成一些实用的东西.对两者做出如下对比更有助于理解“机器学习”这个术语:机器学习研究的内容是教给计算机一些知识,再让计算机 ...

  10. C语言程序设计(十三) 文件操作

    第十三章 文件操作 文本文件:将数值型数据的每一位数字作为一个字符以其ASCII码的形式存储(每一位数字都单独占用一个字节的存储空间) 二进制文件:数据值是以二进制形式存储的 文本文件可以方便地被其他 ...