Rabbitmq学习(一) Rabbitmq初探

Rabbitmq学习(一) Rabbitmq初探

理论
定义
消息队列:在消息的传输过程中保存消息的的容器。

这是一个较为经典的消费-生产者模型,说起来比较抽象,打个比方:A线程需要给B线程发送消息(A、B线程不一定是在同一台机器上的),A线程先把消息发送到消息队列服务器上,然后B线程去读取或是订阅消息服务器上消息队列中的消息,线程A和B之间并没有进行直接通信。MQ服务器在中间起到中继的作用。

适用的应用场景
比较适合异步传输,这里解释一下什么是异步和同步。

异步:发送方不关心消息有没有发送成功,只发送消息,不去获取消息是否发送成功。

同步:发送方关心消息是否发送成功,发送消息后,会等待接收方返回状态码,根据状态码来判断是否发送成功,然后执行相对于的动作。

下边以Http中的同步和异步为例:

如:普通的B/S架构客户端和服务器端之间的通信就是同步的,即提交请求 ---> 等待服务器处理完毕返回消息 ---> 拿到服务器返回的消息,处理完毕。

如:Ajax技术就是异步的,请求通过事件触发 ---> 服务器处理(浏览器不用等待,仍可以做其他的事情) ---> 处理完毕。

有人可能会好奇说应用场景怎么说到了同步和异步,那说明你还不是很理解技术和应用场景之间的紧密联系。


工作过程

生产者客户端:
客户端连接到RabbitMQ服务器上,打开一个消息通道(channel);
客户端声明一个消息交换机(exchange),并设置相关属性。
客户端声明一个消息队列(queue),并设置相关属性。
客户端使用routing key在消息交换机(exchange)和消息队列(queue)中建立好绑定关系。
客户端投递消息都消息交换机(exchange)上
客户端关闭消息通道(channel)以及和服务器的连接。
服务器端:
exchange接收到消息后,根据消息的key(这个key的产生规则暂时没研究,有知道的小伙伴可以留言告诉我)和以及设置的binding,进行消息路由,将消息投递到一个或多个消息队列中。

安装
由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang,执行命令:

sudo apt-get install erlang

这样就安装完了。
接下来,安装rabbitMq:
sudo apt-get install rabbitmq-server

安装完之后启动rabbitMQ

创建用户
sudo rabbitmqctl add_user lsl 123456

将用户设置为管理员(只有管理员才能远程登录)

sudo rabbitmqctl set_user_tags 用户名 administrator

同时为用户设置读写等权限
sudo rabbitmqctl set_permissions -p / lsl ".*" ".*" ".*"

跟着访问 http://192.168.136.130:15672/
就能看到配置页面了,这也说明已经成功安装rabbitmq

实战消费者和生产者(PHP版本
生产者:生产消息,发送消息。类似工厂。
消费者:接受消息,使用消息。类似顾客。
队列:存储消息。类似仓库、中转站。队列可以存储很多的消息,因为它基本上是一个无限制的缓冲区,前提是你的机器有足够的存储空间。多个生产者可以将消息发送到同一个队列中,多个消费者也可以只从同一个队列接收数据。这就是队列的特性。

下面写一个demo来实现rabbitmq的消费者和生产者
send.php

<?php
//配置信息
$conn_args = array(
    ‘host‘ => ‘127.0.0.1‘,
    ‘port‘ => ‘5672‘,
    ‘login‘ => ‘lsl‘,
    ‘password‘ => ‘123456‘,
    ‘vhost‘=>‘/‘
);
$e_name = ‘e_linvo‘; //交换机名
//$q_name = ‘q_linvo‘; //无需队列名
$k_route = ‘key_1‘; //路由key 

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

//创建交换机对象
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
date_default_timezone_set("Asia/Shanghai");
//发送消息
//$channel->startTransaction(); //开始事务
for($i=0; $i<5; ++$i){
    sleep(2);//每个两秒发送一条消息
    //消息内容
    $message = "HelloWorld!".date("h:i:sa");
    echo "Send Message:".$ex->publish($message, $k_route)."\n";
}
//$channel->commitTransaction(); //提交事务 

$conn->disconnect();
?>

rec.php

<?php
//配置信息
$conn_args = array(
    ‘host‘ => ‘127.0.0.1‘,
    ‘port‘ => ‘5672‘,
    ‘login‘ => ‘lsl‘,
    ‘password‘ => ‘123456‘,
    ‘vhost‘=>‘/‘
);
$e_name = ‘e_linvo‘; //交换机名
$q_name = ‘q_linvo‘; //队列名
$k_route = ‘key_1‘; //路由key 

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
    die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);

//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declare()."\n";

//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$q->declare()."\n";

//绑定交换机与队列,并指定路由键
echo ‘Queue Bind: ‘.$q->bind($e_name, $k_route)."\n";

//阻塞模式接收消息
echo "Message:\n";
while(True){
    $q->consume(‘processMessage‘);
    //$q->consume(‘processMessage‘, AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();

先让消费者接收消息

再调用生产者发送消息

再查看消费者收到的消息

假设消费者挂掉了,看看消息是怎么样的

看一下之前部署的,你会发现linvo这个队列里有5条消息,这意味着没有消费者去读取它,把消息堆积在队列里了

当你打开消费者,页面的Total值就马上变为0了,这意味着消息已经被接收。
这样就模拟了队列对消息的处理。

原文地址:http://blog.51cto.com/13475644/2316244

时间: 2024-10-07 22:36:21

Rabbitmq学习(一) Rabbitmq初探的相关文章

RabbitMQ学习(三).NET Client之Publish/Subscribe

3 Publish/Subscribe Sending messages to many consumers at once Python | Java | Ruby | PHP| C# 转载请注明出处:jiq?钦's technical Blog Publish/Subscribe (using the .NET Client) 前面的教程我们已经学习了如何创建工作队列,工作队列背后的假设是每一个任务都被准确地递送给一个worker进行处理.这里我们将介绍完全不同的模式,即一个消息可以递送给多

RabbitMQ学习及实践2---介绍及简单Java实现

一,基本概念 MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息.MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品. RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协

RabbitMQ学习及实践3--SpringMVC实现

根据学习的RabbitMQ知识配了一个SpringMVC的实现.这是一个完整的工程,view的部分使用freeMarker,持久化操作是通过mybatis实现. 整个工程的目录结构如下: src下的相关包的解释: controller:控制器: domain:对应数据库的操作对象类: persistence:mybatis的持久化操作: util:相关工具类: msg.bean:消息类,定义及描述消息体: msg.convert:实现如何转化消息体为可接受的消息类: msg.process:处理

rabbitmq 学习-9- RpcClient发送消息和同步接收消息原理

rabbitmq 学习-9- RpcClient发送消息和同步接收消息原理

RabbitMQ学习系列(四): 几种Exchange 模式

上一篇,讲了RabbitMQ的具体用法,可以看看这篇文章:RabbitMQ学习系列(三): C# 如何使用 RabbitMQ.今天说些理论的东西,Exchange 的几种模式. AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储.同理,消费者也是如此.Exchange 就类似于一个交换机,转发各个消息分发到相

RabbitMQ学习之:(六)Direct Exchange (转贴+我的评论)

From: http://lostechies.com/derekgreer/2012/04/02/rabbitmq-for-windows-direct-exchanges/ RabbitMQ for Windows: Direct Exchanges Posted by Derek Greer on April 2, 2012 This is the fifth installment to the series: RabbitMQ for Windows.  In thelast inst

RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成 最后面有下载地址,只是做了少许改变,改变的代码如下: 消费者 spring-config.xml(还需要增加一个QueueListener监听器,代码就不复制到这里了,可以参考项目中的其他监听器) <!-- =========================

RabbitMQ学习系列(三): C# 如何使用 RabbitMQ

上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实际开发的过程中,怎么调用 用RabbitMQ. 一.客户端 RabbitMQ 有很多客户端API,都非常的好用.我们在一边,一直用的都是 EasyNetQ,所以这里的 demo 只介绍 EasyNetQ 客户端实现.其他的客户端,大家自己去研究吧. EasyNetQ 是一个易于使用的RabbitMQ

RabbitMQ (消息队列)专题学习01 RabbitMQ部署

一.概述 RabbitMQ(Message Queue)是当前流行的开源的消息队列系统,用ERLang语言开发,按照AMQP(Advanced Message Queue Protocol)的标准实现,消息队列是一种应用程序对应用程序之间的通信方法,应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,则无需专用链接来链接它们,RabbitMQ便是这样一种用于应用程序之间通信的中间件. 二.架构 RabbitMQ的架构图如下: 图-1 在此有几个概念需要说明一下: 1.Exchange:消