一、消息队列使用场景或者其优点
消息队列通常是在项目中,将一些无需即时返回且耗时的操作提取出来。进行了异步处理,而这种异步处理的方式大大的节省了server的请求响应时间,从而提高了系统的吞吐量。
在项目启动之初来预測将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。
这同意你独立的扩展或改动两边的处理过程。仅仅要确保它们遵守相同的接口约束。
消息队列能够解决这样一个问题,也就是其解耦性。解耦伴随的优点就是减少冗余,灵活,易于扩展。
峰值处理能力:当你的应用上了Hacker News的首页。你将发现訪问流量攀升到一个不同平常的水平。在訪问量剧增的情况下。你的应用仍然须要继续发挥作用,可是这种突发流量并不常见;假设为以能处理这类峰值訪问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住增长的訪问压力,而不是由于超出负荷的请求而全然崩溃。
消息队列还有可恢复性、异步通信、缓冲………等各种优点,在此不一一介绍,用到自然理解。
二、RabbitMQ来源
RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列server。
显然,RabbitMQ跟Erlang和AMQP有关。以下简介一下Erlang和AMQP。
Erlang是一门动态类型的函数式编程语言,它也是一门解释型语言,由Erlang虚拟机解释执行。从语言模型上说。Erlang是基于Actor模型的实现。在Actor模型里面。万物皆Actor。每一个Actor都封装着内部状态,Actor相互之间仅仅能通过消息传递这一种方式来进行通信。相应到Erlang里,每一个Actor相应着一个Erlang进程。进程之间通过消息传递进行通信。相比共享内存,进程间通过消息传递来通信带来的直接优点就是消除了直接的锁开销(不考虑Erlang虚拟机底层实现中的锁应用)。
AMQP(Advanced Message Queue Protocol)定义了一种消息系统规范。这个规范描写叙述了在一个分布式的系统中各个子系统怎样通过消息交互。
而RabbitMQ则是AMQP的一种基于erlang的实现。
AMQP将分布式系统中各个子系统隔离开来,子系统之间不再有依赖。子系统仅依赖于消息。子系统不关心消息的发送者。也不关心消息的接受者。
这里不必要对Erlang和AMQP作过于深入介绍。毕竟本文RabbitMQ才是主角哦。哈哈。以下直接看主角表演(实例)啦,至于主角的一些不得不深入介绍的点我们放到最后面。
三、RabbitMQ实例(Java)
3.1、环境配置
RabbitMQ的执行须要erlang的支持,因此我们先安装erlang。
前面我们也讲到RabbitMQ就是一个server,以下我们就安装相应server。cd C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.3.4\sbin
rabbitmq-server start
博主的之前启动过了,所以报错,假设你的也启动了就没问题了。
接下来自然是jar包依赖,本文project採用eclipse + maven,maven依赖例如以下:
com.rabbitmq
amqp-client
3.0.4
commons-lang
commons-lang
2.6
由于兴许样例里面实用到序列化的,因此加上序列化工具包相关依赖。
3.2、样例一代码和效果
新建发送者Send.java,代码例如以下:
package com.luo.rabbit.test.one;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Send {
//队列名称
private final static String QUEUE_NAME = "queue";
public static void main(String[] argv) throws java.io.IOException
{
/**
* 创建连接连接到MabbitMQ
*/
ConnectionFactory factory = new ConnectionFactory();
//设置MabbitMQ所在主机ip或者主机名
factory.setHost("127.0.0.1");
//创建一个连接
Connection connection = factory.newConnection();
//创建一个频道
Channel channel = co