AMQP与RabbitMQ
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10922433.html
一:AMQP是什么
AMQP(Advanced Message Queuing Protocol)高级消息队列协议,是基于JMS进行进一步扩展和优化的异步消息处理协议。
其在JMS的基础上,提供了更多的方法。
AMQP引入了消息交换机Exchange的概念,实现了消息生产者与消息队列之间的解耦。消息不再直接发送到队列或者主题,而是统一发送给Exchange,由交换机根据路由规则,将消息分发到不同队列中。
AMQP还引入了Channel概念,将一个connection细分为不同channel,适用于多线程场景下,消息消费者与AMQP服务器只需建立一个TCP连接即可,各个线程对应不同channel,通过channel实现消息的提取。
二:AMQP模型
- Broker: 接收和分发消息的应用,RabbitMQ Server就是一个消息处理实体。
- Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
- Connection: publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。
- Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
- Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
- Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。
- Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
三:AMQP消息传送模型
发布者(Publisher)发布消息(Message),传送到broker;
在broker中,消息被交换机(Exchange)根据路由规则,通过binding传送到不同的队列;
最后 AMQP 代理会将消息投递给订阅了此队列的消费者(push API),或者消费者按照需求自行获取(pull API)。
四:Exchange分发策略
Direct:当消息的routing key 与 binding 的 routing key 直接匹配,消息路由到该队列
Topic: 当消息routing key 与 binding 的 routing key 符合通配符匹配,消息路由到该队列(请百度通配符匹配)
Headers: 当消息参数表中的头信息和值都与 binding参数表中匹配的话,消息路由到该队列
Fanout: 任何消息直接匹配到所有队列上
五:RabbitMQ的使用
1、SpringBoot集成RabbitMQ
1)配置pom包:spring-boot-starter-amqp
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2)配置RabbitMQ服务器信息
首先,需要一台主机安装并启动RabbitMQ。
然后在项目中配置:
spring.application.name=应用名 spring.rabbitmq.host=RabbitMQ服务器的host
spring.rabbitmq.port=5672
spring.rabbitmq.username=RabbitMQ服务器的登录帐号
spring.rabbitmq.password=密码
3)配置消息队列
@Configuration
public class RabbitConfig { @Bean
public Queue Queue() {
return new Queue("hello");
} }
4)使用模版,实现消息生产者
@component
public class HelloSender { @Autowired
private AmqpTemplate rabbitTemplate; public void send() {
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("hello", context);//自动转换为消息对象并要求发送到hello队列
} }
5)实现消息接收者——创建监听器,监听hello队列,一旦有消息则调用process函数进行处理
@Component
@RabbitListener(queues = "hello")
public class HelloReceiver { @RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
} }
2、Python使用RabbitMQ
1)下载RabbitMQ并解压
下载网址: http://www.rabbitmq.com/install-generic-unix.html
解压后,进入 sbin 目录, 运行 server。
默认端口为5672。
2)pip安装AMQP协议实现模块——pika
3)消息生产者:
# -*- coding: utf-8 -*- import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='first', type='fanout') channel.queue_declare(queue='hello')
channel.queue_bind(exchange='first', queue='hello') channel.basic_publish(exchange='first', routing_key='', body='Hello World!')
- 获取连接.
- 从连接上获取一个 channel.
- 声明一个 exchange . (只会创建一次)
- 声明一个 queue . (只会创建一次)
- 把 queue 绑定到 exchange 上.
- 向指定的 exchange 发送一条消息.
4)消息消费者
# -*- coding: utf-8 -*- import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello') def callback(ch, method, properties, body):#消息处理函数
print body channel.basic_consume(callback, queue='hello', no_ack=True)
channel.start_consuming()
- 获取连接.
- 从连接上拿到 channel .
- 声明需要的 queue .
- 定义一个从指定 queue 获取消息的回调处理.
- 开始接收消息.
5)查看rabbitMQ的服务状态
使用 rabbitmqctl 这个工具。例如:查看当前的队列情况
./rabbitmqctl list_queues
六:深入
- 持久化
- 调度策略
- 分配策略
- 状态反馈
AMQP与RabbitMQ的更多相关文章
- rabbitmq学习(一):AMQP协议,AMQP与rabbitmq的关系
前言 当学习完AMQP的基本概念后,可以到http://tryrabbitmq.com/中利用rabbitmq模拟器进行消息的模拟发送和接收 一.什么是AMQP,AMQP与rabbitmq的关系 AM ...
- RabbitMQ学习之:(十)AMQP和RabbitMQ介绍 (转贴+我的评论)
From: http://www.infoq.com/cn/articles/AMQP-RabbitMQ 准备开始 高级消息队列协议(AMQP1)是一个异步消息传递所使用的应用层协议规范.作为线路层协 ...
- AMQP与RabbitMQ简介
MQ(Message Queue,消息队列)是一种应用系统之间的通信方法.是通过读写出入队列的消息来通信(RPC则是通过直接调用彼此来通信的). 1.AMQP协议 在了解RabbitMQ之前,首先要了 ...
- AMQP学习 & RabbitMQ 与 ActiveMQ、ZeroMQ以及Kafka的比较
之前写了一篇文章关于Active以及消息队列推拉模式的文章,可以参考:link 关于 Active 与 RabbitMQ以及其他的比较,有如下记录: 这篇文章 link 提到: 基本介绍RabbitM ...
- AMQP及RabbitMQ
AMQPAMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程. ...
- 译: 1. RabbitMQ Spring AMQP 之 Hello World
本文是译文,原文请访问:http://www.rabbitmq.com/tutorials/tutorial-one-spring-amqp.html RabbitMQ 是一个Brocker (消息队 ...
- Rabbimq必备基础之对高级消息队列协议AMQP分析及Rabbitmq本质介绍
MQ的一个产品... [消息队列] 1. MSMQ windows自带的一个服务... [petshop],message存放在文件系统中. 最原始的消息队列... [集群,消息确认,内存化,高可用, ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式
Windows 安装 amqp 扩展 RabbitMQ 是基于 amqp(高级消息队列协议) 协议的.使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展. 下载相应版本的 amqp ...
- PHP中RabbitMQ之amqp扩展实现(四)
目前我在PHP里接触实现RabbitMQ的方式有两种,一种是通过amqp扩展,一种是使用php-amqplib,本章讲诉RabbitMQ的安装及amqp扩展及amqp扩展如何实现RabbitMQ 环境 ...
随机推荐
- LG2852/BZOJ1717 「USACO2006DEC」Milk Patterns 离散化+后缀数组
问题描述 LG2852 题解 字符串性质:字符串\(s\)的每个字串等于每个后缀的所有前缀 对输入的东西离散化,然后把数值看做\(\mathrm{ASCII}\)后缀排序 二分答案,二分长度. 显然一 ...
- luoguP3704 [SDOI2017]数字表格
题意 默认\(n\leqslant m\) 所求即为:\(\prod\limits_{i=1}^n\prod\limits_{j=1}^mf[\gcd(i,j)]\) 枚举\(\gcd(i,j)\)变 ...
- coreml之通过URL加载模型
在xcode中使用mlmodel模型,之前说的最简单的方法是将模型拖进工程中即可,xcode会自动生成有关模型的前向预测接口,这种方式非常简单,但是更新模型就很不方便. 今天说下另外一种通过URL加载 ...
- HTTP协议,到底是什么鬼?
作者 | Jeskson 来源 | 达达前端小酒馆 了解HTTP HTTP是什么呢?它是超文本传输协议,HTTP是缩写,它的全英文名是HyperText Transfer Protocol. 那么什么 ...
- BeanCreationException: Error creating bean with name 'classPathFileSystemWatcher'之解决办法
错误关键信息: BeanCreationException: Error creating bean with name 'classPathFileSystemWatcher' 错误原因:Idea不 ...
- CentOS7 GitLab 安装
1.安装依赖 $ yum -y install policycoreutils openssh-server openssh-clients postfix $ yum install policyc ...
- ES6高级技巧(五)
Set 由于Set结构没有键名,只有键值所有keys方法和values方法的行为完全一致 let a=new Set([1,2,3,4]) //a.keys() a.values() 或者直接用of遍 ...
- Intellij IDEA的安装教程
一.下载安装 1.打开官网:http://www.jetbrains.com/idea/,点击页面中的“DOWNLOAD” 2.根据自己的需要选择下载的IntelliJ IDEA版本,此处我的电脑是W ...
- SQL忽略重复键作用
1.插入时如果开启的话,发现重复键会忽略,否则报错 2.更新时不管开启是否都会报错
- Nginx php上传文件大小的设置