amqp

RabbitMQ 核心概念及与 Spring Boot 2 的整合

限于喜欢 提交于 2020-04-27 19:31:27
RabbitMQ 简介 RabbitMQ 是什么 RabbitMQ 是一个用 Erlang 编写的开源的消息队列中间件,它实现了 AMQP 协议(其实还实现了 MTQQ 等消息协议)。和其他两个主流的消息队列中间件 Kafka 和 RocketMQ 相比,拥有更低的延迟、更高的稳定性、更完备的功能、更完善的文档支持以及较活跃的开源社区支持,但是在吞吐量上和分布式扩展能力上逊色一些。 AMQP 是什么 AMQP(Advanced Message Queuing Protocol),高级消息队列协议,是一个语言无关的面向消息中间件的开放标准,它定义了一套消息中间件的模型架构,即生产者将消息发送给交换机,交换机根据路由键将消息路由到队列,消费者通过订阅队列来获取消息。从更低的层面来看,AMQP是一套应用层的通信协议,它跟 HTTP 这样的协议一样提供了 TCP 之上的报文封装定义,定义了协议命令的交互规则。RabbitMQ 就用 Erlang 实现了 AMQP。 Exchange(交换机) 是什么 通常消息队列只会有生产者、队列和消费者三个概念,而 AMQP 多引入了一个概念 Exchange 交换机(也译交换器),生产者会将消息发送到交换机,交换机再根据自身的路由策略和 routing key(路由键)将消息转发到合适的队列上。这里 Exchange 其实更应该叫 Router

RabbitMQ消息投递、可靠性传输、重复消费、消息的顺序性等问题

孤街浪徒 提交于 2020-04-27 18:55:37
1、什么是RabbitMQ?为什么要使用RabbitMQ? <br>          RabbitMQ是一款开源的、Erlang语言编写的、基于AMQP协议的消息中间件。<br>          解耦:实现消费者和生产者之间的解耦<br>          异步:将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度<br>          削峰:将高并发时的同步访问变为串行访问达到一定量的限流,利于数据库的操作<br> <br> 2、RabbitMQ的使用场景? <br>          1、服务间异步通信<br>          2、顺序消费<br>          3、定时任务<br>          4、请求削峰<br> <br> 3、RabbitMQ的优缺点? <br>          优点:服务间高度解耦、异步通信性能高、流量削峰填谷。<br> 缺点:系统可用性降低:比如在系统中引入MQ,那么万一MQ挂了怎么办呢?一般而言,引入的外部依赖越多,系统越脆弱,每一个依赖出问题都会导致整个系统的崩溃;<br> 系统复杂度提高:要考虑MQ的各种情况,比如:消息的重复消费、消息丢失、保证消费顺序等等;<br> 一致性问题:假设A系统依赖BCD,A已经给用户返回操作成功,这时候操作BC都成功了,操作D却失败了,会导致数据不一致。 <br> 4

Spring Boot系列(8)——RabbitMQ确认、退回模式及死信队列

大兔子大兔子 提交于 2020-04-27 18:53:43
〇、什么是消息队列   参考: 新手也能看懂,消息队列其实很简单      RabbitMQ运行模型与名词解释 一、应答模式   1.什么是应答?     消息投递到交换器(exchange)中,交换器给我们的反馈,是保障消息投递成功的一种机制。   2.测试   配置: 1 #选择确认类型为交互 2 spring.rabbitmq.publisher-confirm-type=correlated   测试方法: 1 @Test 2 /** 3 * the test is testing confirm-function in rabbitmq 4 */ 5 void messageSendTestWithConfirm(){ 6 7 /* 8 * 设置消息确认回调方法; 9 * @ack 为true时,表示投递成功;为false表示投递失败; 10 * @CorrelationData 为自定义反馈信息; 11 * @cause 为投递失败的原因; 12 */ 13 rabbitTemplate.setConfirmCallback( new RabbitTemplate.ConfirmCallback() { 14 @Override 15 public void confirm(CorrelationData correlationData, boolean ack,

rabbitmq生产者的消息确认

荒凉一梦 提交于 2020-04-27 08:49:46
通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以保证消息被处理。 1.什么是Publisher Confirms and Returns? Delivery processing acknowledgements from consumers to RabbitMQ are known as acknowledgements in AMQP 0-9-1 parlance; broker acknowledgements to publishers are a protocol extension called publisher confirms. 地址: http://www.rabbitmq.com/confirms.html 根据RabbitMq官网定义,rabbitmq代理(broker)对发布者(publishers)的确认被称作发布者确认(publisher confirms),这种机制是Rabbitmq对标准Amqp协议的扩展。因此通过这种机制可以确认消息是否发送给了目标。 2.如何通过Spring amqp来使用Publisher Confirms and Returns机制? Confirmed and

Redis与RabbitMQ作为消息队列的比较

只愿长相守 提交于 2020-04-27 04:00:04
简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 Redis 是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。 具体对比 可靠消费 Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理 RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费 可靠发布 Reids:不提供,需自行实现 RabbitMQ:具有发布确认功能,保证消息被发布到服务器 高可用 Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案 RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作 持久化 Redis:将整个Redis实例持久化到磁盘 RabbitMQ:队列,消息,都可以选择是否持久化 消费者负载均衡 Redis:不提供,需自行实现 RabbitMQ:根据消费者情况,进行消息的均衡分发 队列监控 Redis

springboot 集成 rabbitMQ

限于喜欢 提交于 2020-04-27 03:24:16
rabbitMQ:先放两张图 方便记忆 视频教程: https://study.163.com/course/courseMain.htm?courseId=1004576013 环境:首先要安装好 rabbitMQ springboot 集成 rabbitMQ还是挺简单的。 rabbitMQ的原理是(个人理解),自己做好的demo已经保存到百度网盘下。 生产者:发送消息给交换器 exchange 消费者:监听队列消息 队列:队列和交换器绑定 交换器:生产者发送消息给路由器 交换器根据规则发送消息到队列 1.创建一个springboot项目 依赖:web,rabbitMQ 2.配置properties spring.application.name= rabbitMQ server.port = 8080 spring.rabbitmq.host = 172.17 . 0.50 spring.rabbitmq.port = 5672 spring.rabbitmq.username = hanhao spring.rabbitmq.password =hanhao 第二种配置:direct spring.application.name= rabbitDirectProvider server.port = 9999 spring.rabbitmq.host = 172.17 .

RabbitMQ消息可靠性分析

血红的双手。 提交于 2020-04-27 02:38:20
原文: RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说。的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此。可靠并不是一个绝对的概念,曾经有人也留言说过类似全部磁盘损毁也会导致消息丢失,笔者戏答:还有机房被炸了也会导致消息丢失。可靠性是一个相对的概念,在条件合理的范围内系统所能确保的多少个9的可靠性。一切尽可能的趋于完美而无法企及于完美。 我们可以尽可能的确保RabbitMQ的消息可靠。在详细论述RabbitMQ的消息可靠性之前,我们先来回顾下消息在RabbitMQ中的经由之路。 如图所示,从AMQP协议层面上来说: 消息先从生产者Producer出发到达交换器Exchange; 交换器Exchange根据路由规则将消息转发对应的队列Queue之上; 消息在队列Queue上进行存储; 消费者Consumer订阅队列Queue并进行消费。 我们对于消息可靠性的分析也从这四个阶段来一一探讨。 Phase 1 消息从生产者发出到达交换器Exchange,在这个过程中可以发生各种情况,生产者客户端发送出去之后可以发生网络丢包、网络故障等造成消息丢失。一般情况下如果不采取措施,生产者无法感知消息是否已经正确无误的发送到交换器中

SpringBoot集成rabbitmq(二)

痴心易碎 提交于 2020-04-27 02:35:48
前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失。除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特殊配置,默认情况下发送的消息是不会给生产者返回任何响应的,也就是默认情况下生产者并不知道消息是否正常到达了服务器。对于数据必达的需求,你肯定对消息的来龙去脉都有个了接,这种情况下就需要用到rabbitmq消息确认。 消息确认 rabbitmq消息确认分为生产者确认和消费者确认。 生产者消费确认提供了两种机制: 通过事务机制实现 通过confirm机制实现 事务机制则用到channel.txSelect、channel.txCommit、channel.txRollback。可以参考下面AMQP协议流转过程(参考Rabbitmq实战指南) 事务机制在一条消息发送之后会阻塞发送端,以等待rabbitmq回应,之后才继续发送下一条消息。所以相对来说事务机制的性能要差一些。事务机制会降低rabbitmq的吞吐量,所以又引入了另一种轻量级的方式: confirm机制。 生产者通过调用channel.confirmSelect将信道设置为confirm模式,之后Rabbitmq会返回Confirm.Select-Ok命令表示同意生产者将当前信道设置为confirm模式

SpringBoot消息队列之-rabbitMQ

本秂侑毒 提交于 2020-04-26 19:05:22
一、概述 1.在大多应用中,我们系统之间需要进行异步通信,即异步消息。 2.异步消息中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地。 3.异步消息主要有两种形式的目的地 队列(queue):点对点消息通信(point-to-point) 主题(topic):发布(publish)/订阅(subscribe)消息通信 4.点对点式: –消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列 –消息只有唯一的发送者和接受者,但并不是说只能有一个接收者 5.发布订阅式: –发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息 二、AMQP(Advanced Message Queuing Protocol) –高级消息队列协议,也是一个消息代理的规范,兼容JMS –RabbitMQ是AMQP的实现 核心概念: Producer&Consumer –producer指的是消息生产者,consumer消息的消费者。 Broker –它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输 Queue –消息队列

rabbitmq学习(三) —— 工作队列

一世执手 提交于 2020-04-26 19:04:59
工作队列,又称任务队列,主要思想是避免立即执行资源密集型任务,并且必须等待完成。相反地,我们进行任务调度,我们将一个任务封装成一个消息,并将其发送到队列。工作进行在后台运行不断的从队列中取出任务然后执行。当你运行了多个工作进程时,这些任务队列中的任务将会被工作进程共享执行。 这个概念在 Web 应用程序中特别有用,在短时间 HTTP 请求内需要执行复杂的任务。 准备工作 现在,假装我们很忙,我们使用 Thread.sleep 来模拟耗时的任务。 发送端 public class NewTask { private final static String QUEUE_NAME = "hello" ; public static void main(String[] args) throws IOException, TimeoutException { // 创建连接 ConnectionFactory factory = new ConnectionFactory(); // 设置 RabbitMQ 的主机名 factory.setHost("localhost" ); // 创建一个连接 Connection connection = factory.newConnection(); // 创建一个通道 Channel channel = connection