AMQP[高级消息队列协议] 是一个异步消息传递所使用的应用层协议规范(是线路层协议)
AMQP 客户端能够无视消息的来源任意发送和接受信息

队列的使用场景:

1、与业务的主要逻辑无关,但又需要执行,就可以使用队列异步处理。

  将与主逻辑无关的操作放入队列,因为程序要等待全部操作执行完才返回用户操作结果,就会减低用户体验。

2、耗时操作放队列执行、一般不关心执行结果的(发送邮件)。

3、利用队列的特性,可以使一些应用更加简单。

  1、队列支持多种语言客户端,可以实现不同语言间的相互通信。

  2、队列有支持delay特性,可以实现简单的定时效果。

4、两个(多个)系统间需要通过定时任务来同步数据(数据交换)。

5、异构系统的不同进程间相互调用、通讯。

基本概念:

Broker:简单来说就是消息队列服务器实体。

  接收客户端连接,实现AMQP消息队列和路由功能的进程。

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

  从连接通道(Channel)接收消息,并按照特定的路由规则发送给队列。接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,ExchangeType有direct、Fanout和Topic三种。

Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

  当消息不能被正常消费时缓存这些消息。(存储还未被消费者消费的消息)

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

  1、即路由规则,告诉交换机将何种类型的消息发送到某个队列中。

  2、Exchange在与多个Message Queue发生Binding后会生成一张路由表。

  3、路由表中存储着Message Queue所需消息的限制条件即Binding Key,当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。(每个virtual Host里面有若干个Exchange和Queue)

  虚拟机可以持有多个交换机、队列和绑定。

producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

  1、仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。

  2、一个Connection可以包含多个Channel,需要Channel是因为TCP连接的建立和释放都是十分昂贵的。

message: 消息体,由producer产生,经broker被consumer所消费。

  包括Header,Body两部分,Header是由Producer添加上的各种属性集合,控制Message是否被缓存,接收的queue是哪个等等。Body是真正需要传送的数据。

Connection:连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。

模型:

Publisher --> Broker(消息队列服务器实体) --> Consumer

client[Publisher Application] --> Message --> Virtual Host[ Exchange-->Message queue ] --> client[Consumer]

RabbitMQ的使用场景:

1、单发送,单接收。

  简单的发送与接收,没有特别的处理。

2、单发送多接收。

  一个发送端,多个接收端,如分布式的任务派发。为了保证消息发送的可靠性,不丢失消息,使消息持久化了。同时为了防止接收端在处理消息时down掉,只有在消息处理完成后才发送ack消息。

3、发布、订阅模式。

  发布、订阅模式,发送端发送广播消息,多个接收端接收。

4、Routing (按路线发送接收)

  发送端按routing key发送消息,不同的接收端按不同的routing key接收消息。

5、Topics (按topic发送接收)

  发送端不只按固定的routing key发送消息,而是按字符串“匹配”发送,接收端同样如此。

# RabbitMQ的开启关闭命令:
[root@localhost ~]# /opt/rabbitmq/sbin/rabbitmq-server -detached start // 启动rabbitMQ
[root@localhost ~]# /opt/rabbitmq/sbin/rabbitmqctl status // 查看状态
[root@localhost ~]# /opt/rabbitmq/sbin/rabbitmqctl stop // 关闭rabbitMQ

实现的PHP代码:

消息消费者端:

<?php 

//连接RabbitMQ
$conn_args = array(
'host'=>'localhost' ,
'port'=> '5672',
'login'=>'guest' ,
'password'=> 'guest',
'vhost' =>'/'
);
$conn = new AMQPConnection($conn_args);
$conn->connect();
//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName('queue_name');
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declareQueue();
$q->bind('direct_exchange_name', 'routingkey_name');
//消息获取
$messages = $q->get(AMQP_AUTOACK) ;
if ($messages){
var_dump(json_decode($messages->getBody(), true ));
}
$conn->disconnect();

消息生产者端:

<?php 

//连接RabbitMQ
$conn_args = array(
'host'=>'localhost' ,
'port'=> '5672',
'login'=>'guest' ,
'password'=> 'guest',
'vhost' =>'/'
);
$conn = new AMQPConnection($conn_args);
$conn->connect();
//创建exchange名称和类型
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName('direct_exchange_name');
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$ex->declareExchange();
//创建queue名称,使用exchange,绑定routingkey
$q = new AMQPQueue($channel);
$q->setName('queue_name');
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declareQueue();
$q->bind('direct_exchange_name', 'routingkey_name');
//消息发布
$channel->startTransaction();
$message = json_encode(array('Hello World!','DIRECT'));
$ex->publish($message, 'routingkey_name');
$channel->commitTransaction();
$conn->disconnect();

RabbitMQ消息队列总结的更多相关文章

  1. RabbitMQ消息队列(一): Detailed Introduction 详细介绍

     http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...

  2. RabbitMQ消息队列1: Detailed Introduction 详细介绍

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  3. (转)RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  4. (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  5. (转)RabbitMQ消息队列(六):使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  6. (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  7. RabbitMQ消息队列应用

    RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...

  8. RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  9. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  10. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

随机推荐

  1. Euclid's Game(POJ 2348)

    原题如下: Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10832   Accepted: 4 ...

  2. selenium常用api之切换:table切换、alert弹框切换、iframe框架切换

    10.查看浏览器打开了多少个table和当前页面在哪个table 测试:打开了浏览器后,打开了一个新的标签页之后,显示此时有2个table,浏览器中当前页面展示的是第2个页面,但是代码打印显示的仍然是 ...

  3. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 4 - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络)

    Week 4 Quiz - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络) \1. What is the "cache" ...

  4. Sql Server中使用特定字符分割字符串

    在T-SQL中我们经常批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.这里将字符串分割以table形式输出 语法如下: SET ANSI_NUL ...

  5. [计算机网络]图解HTTP阅读笔记

    总述 书的定位:一本十分浅显的HTTP书籍,主要介绍了HTTP与HTTPS.适合入门了解,很多地方都是蜻蜓点水,但稍微深入的地方能让人了解重点在哪,后面应该有针对性地阅读深入书籍. 主要内容:介绍了T ...

  6. C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

    1.平移,利用WPF中控件边距来控制位移: /// <summary> /// 平移图像 /// </summary> /// <param name="X&q ...

  7. JVM学习(五)对象的引用类型

    一.引言 前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为:虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 , ...

  8. MySql-8.0.x免安装版下载与配置,Navicat打开数据库链接报错1251的解决办法

    若你以前卸载过mysql,小白极大可能没有卸载和删除干净残留,没有卸载干净就肯定重装不成功,可参考https://www.cnblogs.com/Luoters/p/11869032.html 参考与 ...

  9. linux下Crontab定时任务

    1.命令格式 crontab [-u user] file crontab [-u user] [-e | -l | -r ] 2.命令参数 -u user:用来设定某个用户的crontab服务: f ...

  10. XSS平台简单使用

    XSS常用语句及编码绕过 XSS常用的测试语句有: <script>alert(1)</script> <img src=x onerror=alert(1)> & ...