amqp

RPC机制之AMQP协议

匿名 (未验证) 提交于 2019-12-03 00:43:02
openstack RPC通信 Openstack 的主要组件有 Nova、Cinder、Neutron、Glance 等,分别负责云平台的计算、存储、网络资源管理。OpenStack 各组件之间是通过 REST 接口进行相互通信,而各组件内部则采用了RPC通信。 什么是RPC RPC即Remote Procedure Call(远程方法调用),是Openstack中一种用来实现跨进程(或者跨机器)的通信机制。Openstack中同项目内(如nova, neutron, cinder…)各服务(service)均通过RPC实现彼此间通信。Openstack中还有另外两种跨进程的通信方式: 数据库和Rest API 。 Openstack中服务主要以进程的形式实现。也可以以线程的形式实现,但是Python中的线程是协作模型,无法发挥系统中多CPU(或多CPU核心)的能力。RCP只定义了一个通信接口,其底层的实现可以各不相同。目前Openstack中的主要采用AMQP的实现满足组件内部的松耦合性。 什么是AMQP AMQP即Advanced Message Queuing Protocol()是一种基于队列的可靠消息服务协议,具体可参考 http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol 。作为一种通信协议

RabbitMQ流控测试客户端代码

匿名 (未验证) 提交于 2019-12-03 00:25:02
#include "amqp_tcp_socket.h" #include "amqp.h" #include "amqp_framing.h" #include <unistd.h> #include <string.h> #include <sys/select.h> #include <string> using namespace std ; // g++ -o rabbitmq_producer -g -Wall -Werror -Winline -Wwrite-strings -D RABBITMQ_CLIENT_PRODUCER -std=c++11 rabbitmq-client.cpp -I ../librabbitmq/ ./librabbitmq/librabbitmq.a -lrt // g++ -o rabbitmq_consumer -g -Wall -Werror -Winline -Wwrite-strings -D RABBITMQ_CLIENT_CONSUMER -std=c++11 rabbitmq-client.cpp -I ../librabbitmq/ ./librabbitmq/librabbitmq.a -lrt unsigned int period = 3600 ; unsigned int speed = 1 ; string

In which domains are message oriented middleware like AMQP useful?

那年仲夏 提交于 2019-12-03 00:18:42
问题 What problem do MOM (Message Oriented Middleware) solve? Scalability? Integration? In which domain are they typically used and in which domains are they typically not used? For example, say, is Google using such solution for it's main search engine or to power GMail? What about big websites like Walmart, eBay, FedEx (pretty much a Java shop) and buy.com (pretty much an MS shop)? Does MOM solve a need there? Does it make any sense when you're writing a Webapp where you control the server-side

AMQP 概论

匿名 (未验证) 提交于 2019-12-03 00:09:02
AMQP   是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。 “你好!”,你跟国外的美女一般会说“hello!”一样。 信道 “多路复用”,对于执行多个任务的多线程或者异步应用程序来说,它非常有用。 包括的要素 生产者、消费者、消息   生产者   消费者   消息: 交换器、队列、绑定、路由键   队列通过路由键(routing key,某种确定的规则)绑定到交换器,生产者将消息发布到交换器,交换器根据绑定的路由键将消息路由到特定队列,然后由订阅这个队列的消费者进行接收。 消息的确认   消费者收到的每一条消息都必须进行确认(自动确认和自行确认)。 常见问题   如果消息达到无人订阅的队列会怎么办   多个消费者订阅到同一队列怎么办 ?消息以循环的方式发送给消费者,每个消息只会发送给一个消费者。   消息路由到了不存在的队列怎么办? 虚拟主机 交换器类型 )不实用,可以忽略。 Direct channel->basic_public($msg,’’,’queue-name’) Fanout   消息广播到绑定的队列,不管队列绑定了什么路由键,消息经过交换器

RabbitMQ源码解析前奏--AMQP协议

匿名 (未验证) 提交于 2019-12-03 00:03:02
一、协议 AMQP协议分层类似于OSI或TCP/IP协议分层。从图中可以看出分三层: 图1 AMQP协议分层图 1、Model Layer 规范服务器端Broker的行为。 2、Session Layer 定义客户端与服务器端Broker的Context。 3、Transport Layer 传输二进制数据流。 二、模型 AMQP服务器Broker主要由Exchange和Message Queue组成,主要功能是Message的路由Routing和缓存Buffering。 图2 AMPQ服务器模型图 Exchange接受Producer发送的Message并根据不同路由算法将Message发送到Message Queue。 Message Queue会在Message不能被正常消费时将其缓存起来,但是当Consumer与Message Queue之间的连接通畅时,Message Queue将Message转发给Consumer。 Message由Header和Body组成,Header是由Producer添加的各种属性的集合,包括Message是否客被缓存、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。 Exchange与Message Queue之间的关联通过Binding来实现。Exchange在与多个Message

Spring AMQP

匿名 (未验证) 提交于 2019-12-03 00:03:02
3.1.简介 Sprin有很多不同的项目,其中就有对AMQP的支持: Spring AMQP的页面:http://spring.io/projects/spring-amqp 注意这里一段描述: Spring-amqp是对AMQP协议的抽象实现,而spring-rabbit 是对协议的具体实现,也是目前的唯一实现。底层使用的就是RabbitMQ。 3.2.依赖和配置 添加AMQP的启动器: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在application.yml中添加RabbitMQ地址: spring: rabbitmq: host: 192.168.56.101 username: leyou password: leyou virtual-host: /leyou 3.3.监听者 在SpringAmqp中,对消息的消费者进行了封装和抽象,一个普通的JavaBean中的普通方法,只要通过简单的注解,就可以成为一个消费者。 @Component public class Listener { @RabbitListener(bindings = @QueueBinding(

rabbitmq 结构体

匿名 (未验证) 提交于 2019-12-02 23:45:01
amqp_basic_properties_t props; props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG | AMQP_BASIC_REPLY_TO_FLAG | AMQP_BASIC_CORRELATION_ID_FLAG; props.content_type = amqp_cstring_bytes("text/plain"); props.delivery_mode = 2; /* persistent delivery mode */ props.reply_to = amqp_bytes_malloc_dup(reply_to_queue); if (props.reply_to.bytes == NULL) { fprintf(stderr, "Out of memory while copying queue name"); return 1; } props.correlation_id = amqp_cstring_bytes("1"); 2. amqp_basic_properties_t props; props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;

AMQP 基本概念

匿名 (未验证) 提交于 2019-12-02 23:43:01
AMQP: Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端、中间件不同产品,不同开发语言等条件的限制。 AMQP 0-9-1模型 AMQP 0-9-1的工作过程:消息(message)被发布者(publisher)发送给交换机(exchange),交换机接收到消息根据路由规则分发给绑定的队列(queue)。最后AMQP代理会将消息投递给订阅此队列的消费者或者消费者按需求自行获取。 发布者(publisher)发布消息时可以指定各种消息属性(message meta-data)。有些属性可能会被消息代理(bokers)使用。 从安全角度考虑,网络是不可靠的,发送消息,和接收消息 都是不可靠的。(发送和接收的确认机制)。无法实现生产者到消费者直接的确认机制。 由此我想到的可能引发的问题: 1.生产者发送消息失败 2.消息无接收队列 3.消费者处理失败 4.消费者接收到的消息已超时 交换机(Exchange) 交换机接收生成者 或 其他交换机的消息,按照交换机类型和路由键投递给其他交换机或者消息队列。 交换机只转发消息不存储消息 交换机的类型 DirectExchange 直连交换机 FanoutExchange

RabbitMQ用户指南(RabbitMQ-C)

匿名 (未验证) 提交于 2019-12-02 22:56:40
原文地址为: RabbitMQ用户指南(RabbitMQ-C) RabbitMQ-C客户端使用说明 rabbitmq-c是一个用于C语言的,与AMQP server进行交互的client库,AMQP协议为版本0-9-1。rabbitmq-c与server进行交互前需要首先进行login操作,在操作后,可以根据AMQP协议规范,执行一系列操作。 这里,根据项目需求,只进行部分接口说明,文后附demo的github地址。 接口描述: amqp_connection_state_t amqp_new_connection(void); void amqp_set_sockfd(amqp_connection_state_t state,int sockfd); amqp_channel_open_ok_t *amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel); amqp_queue_bind_ok_t *amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_tab

RabbitMQ: fast producer and slow consumer

大憨熊 提交于 2019-12-02 19:18:41
I have an application that uses RabbitMQ as the message queue to send/receive message between two components: sender and receiver. The sender sends message in a very fast way. The receiver receives the message and then does some very time-consuming task (mainly database writing for very large data size). Since the receiver takes a very long time to finish the task and then retrieve the next message in the queue, the sender will keep filling up the queue quickly. So my question is: Will this cause the message queue to overflow? The message consumer looks like the following: public void