精华内容
下载资源
问答
  • rabbitmq实战指南
    2021-02-26 10:04:45

    19c5bd5bf59e0c28fb9aef2bcb49e39f.png

    9480dab0d3767b916aed43b9cc86cc65.png

    作 者 :朱忠华

    出版发行 : 北京:电子工业出版社 , 2017.11

    ISBN号 :978-7-121-32991-3

    页 数 : 336

    原书定价 : 79.00

    开本 : 128开

    主题词 : JAVA语言-程序设计-指南

    中图法分类号 : TP312;JA ( 工业技术->自动化技术、计算机技术->计算技术、计算机技术->计算机软件 )

    内容提要:《RabbitMQ实战指南》从消息中间件的概念和RabbitMQ的历史切入,主要阐述RabbitMQ的安装、使用、配置、管理、运维、原理、扩展等方面的细节。《RabbitMQ实战指南》大致可以分为基础篇、进阶篇和高阶篇三个部分。基础篇首先介绍RabbitMQ的基本安装及使用方式,方便零基础的读者以最舒适的方式融入到RabbitMQ之中。其次介绍RabbitMQ的基本概念,包括生产者、消费者、交换器、队列、绑定等。之后通过Java语言讲述了客户端如何与RabbitMQ建立(关闭)连接、声明(删除)交换器、队列、绑定关系,以及如何发送和消费消息等。进阶篇讲述RabbitMQ的TTL、死信、延迟队列更多...《RabbitMQ实战指南》从消息中间件的概念和RabbitMQ的历史切入,主要阐述RabbitMQ的安装、使用、配置、管理、运维、原理、扩展等方面的细节。《RabbitMQ实战指南》大致可以分为基础篇、进阶篇和高阶篇三个部分。基础篇首先介绍RabbitMQ的基本安装及使用方式,方便零基础的读者以最舒适的方式融入到RabbitMQ之中。其次介绍RabbitMQ的基本概念,包括生产者、消费者、交换器、队列、绑定等。之后通过Java语言讲述了客户端如何与RabbitMQ建立(关闭)连接、声明(删除)交换器、队列、绑定关系,以及如何发送和消费消息等。进阶篇讲述RabbitMQ的TTL、死信、延迟队列、优先级队列、RPC、消息持久化、生产端和消费端的消息确认机制等内容,以期读者能够掌握RabbitMQ的使用精髓。《RabbitMQ实战指南》中间篇幅主要从RabbitMQ的管理、配置、运维这三个角度来为读者提供帮助文档及解决问题的思路。高阶篇主要阐述RabbitMQ的存储机制、流控及镜像队列的原理,深入地讲述RabbitMQ的一些实现细节,便于读者加深对RabbitMQ的理解。《RabbitMQ实战指南》还涉及网络分区的概念,此内容可称为魔鬼篇,需要掌握前面的所有内容才可理解其中的门道。《RabbitMQ实战指南》最后讲述的是RabbitMQ的一些扩展内容及附录,供读者参考之用。

    参考文献格式 : 朱忠华.RabbitMQ实战指南[M].北京:电子工业出版社,2017.11.

    更多相关内容
  • rabbitmq实战指南

    2019-04-16 20:03:27
    rabbitmq消息队列,同时epub格式也支持各种软件设备。
  • RabbitMQ实战指南.rar

    2019-06-25 23:50:03
    RabbitMQ 是目前非常热门的一款消息中间件,不管是互联网行业还是传统行业都在大量地使用 。 RabbitMQ 凭借其高可靠、易扩展、高可用及丰富的功能特性受到越来越多企业的青睐 。 作为一个合格的开发者,有必要深入地...
  • RabbitMQ实战指南.7z

    2019-11-30 23:15:44
    RabbitMQ 是目前非常热门的一款消息中间件,不管是互联网行业还是传统行业都在大量 地使用 RabbitMQ 凭借其高可靠、易扩展、高可用及丰富的功能特性受到越来越多企业的青 作为一个合格的开发者,有必要深入地...
  • RabbitMQ实战指南

    2019-07-22 15:22:43
    资源名称:RabbitMQ实战指南资源截图:资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • 前言 Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为null,你会从哪几个方向去排查...

    前言

    Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为null,你会从哪几个方向去排查”这些场景题。那么既然写了这篇文章,闲话少说,发车看看Spring是如何解决的循环依赖,以及带大家看清循环依赖的本质是什么。

    阶段一:筑基

    Java基础掌握不牢,对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基础开始;在面试的时候,面试官无疑不是从基础开始拷问。

    内容包括:Java概述、Java基本语法、Java 执行控制流程、面向对象、访问控制权限、接口和抽象类、异常、内部类、集合、泛形、反射、枚举、I/O、关于 null 的几种处理方式、思维导图。

    1、Java概述

    2、Java基本语法

    3、Java 执行控制流程

    4、面向对象

    5、访问控制权限

    由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lO5IxLtq-1653449369651)(https://upload-images.jianshu.io/upload_images/22932333-5cb2e60b0252b58d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

    仅花半年时间,他从外包月薪5K到阿里月薪15K,究竟经历了什么?

    阶段二:搞定核心知识点

    熟悉了Java基础知识后,我们需要进阶一下,开始抓原理。

    深呼吸,我们来吃透源码,有的同学看到源码就懵逼,其实看源码只是刚开始痛苦,摸清其门道后,其实你会发现并没有很难,而且受用终生。(极大提高自己的学习能力)

    内容:集合、、锁、多线程、数据库原理、JVM基础、常用中间件(Dubbo、Kafka、Redis、Zookeeper)核心原理和框架(Spring、Mybatis、SpringBoot、SpringCloud)核心原理等。

    1、集合

    2、锁

    3、数据库原理

    4、JVM(Java虚拟机,一个虚构出来的计算机)

    5、中间件——Zookeeper

    由于篇幅限制,中间件以ZK为例,框架以SpringBoot原理为例

    6、框架——SpringBoot原理

    阶段三:进阶“功法”

    仅花半年时间,他从外包月薪5K到阿里月薪15K,究竟经历了什么?

    这个阶段,你应该提升自己各方面的知识深度,让自己有亮点,自己在面试的时候有装B的资本。(好心提醒:切莫过度装B)

    **亮点:**如果你有高并发的、大数据量的经验,你可以从这几个方向找:

    1、比较复杂的场景方案设计

    2、线上问题的排查和解决:死锁、宕机、Full GC 频繁等

    3、系统稳定性保障方面的设计:限流、熔断、降级等

    **深度:**挑选1-2个中间件或者框架的源码来深入学习,JDK 源码直接肉眼看的话问题不大,但是如果你直接肉眼看中间件和框架源码的话,你会知道什么叫做残忍。

    Spring+Cloud+Eureka源码分析:

    阶段四:查漏补缺:面试题安排!

    面试题包含:Java、MyBatis、ZooKeeper、Dubbo、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、Kafka、Linux 等技术栈。

    1、MyBatis面试题

    2、Redis面试题

    3、Java并发编程面试题

    最后

    针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

    下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

    在这里插入图片描述

    最新整理电子书

    在这里插入图片描述

    收集的一些大厂的面试真题(都整理成文档,小部分截图)

    [外链图片转存中…(img-ETFayUV4-1653449369663)]

    最新整理电子书

    [外链图片转存中…(img-l2Cf2O6u-1653449369664)]

    展开全文
  • RabbitMQ实战-随书源码

    2018-12-09 16:15:30
    RabbitMQ in action 和 RabbitMQ实战-高效部署分布式消息队列 的随书源码
  • RabbitMQ 实战指南》第一章 RabbitMQ 简介

    《RabbitMQ 实战指南》第一章 RabbitMQ 简介

    一、什么是消息中间件

    消息(Message)是指在应用间传送的数据,消息类型可以是文本字符串JSON 或者内嵌对象

    消息队列中间件(Message Queue Middleware,简称为 MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信

    MQ 一般有两种传递模式:点对点(P2P,Point-to-Point)模式发布/订阅(Pub/Sub)模式。点对点模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。主题使得消息的订阅者与消息的发布者相互保持独立,不需要进行接触即可保证消息的传递,发布/订阅模式在消息的一对多广播时采用

    面向消息的中间件(简称为 MOM,Message Oriented Middleware)提供了以松耦合的灵活方式集成应用程序的一种机制。它们提供了基于存储和转发的应用程序之间的一部数据传输,即应用程序彼此不直接通信,而是与作为中介的 MQ 通信。MQ 提供了有保证的消息发送,应用程序开发人员无需了解远程过程调用(RPC)和网络通信协议的细节

    MQ 适用于需要可靠的数据传输的分布式环境。采用 MQ 的系统中,不同的对象之间通过传递消息来激活对方的时间,以完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。MQ 能在不同平台之间通信,它常被用来屏蔽各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进步的原因

    在这里插入图片描述

    以图 1-1 为例,应用程序 A 与应用程序 B 通过使用 MQ 的应用程序编程接口(API,Application Program Interface)发送消息来进行通信

    MQ 将消息路由给应用程序 B,这样消息就可以存在于完全不同的计算机上。消息中间件负责处理网络通信,如果网络连接不可用,MQ会存储消息,直到连接变得可用,再将消息转发给应用程序 B。灵活性的另一方面体现在,当应用程序 A 发送其消息时,应用程序 B 甚至可以处于不运行状态,MQ 将保留这份消息,直到应用程序 B 开始执行并消费消息,这样还防止了应用程序 A 因为等待应用程序 B 消费消息而出现阻塞

    二、消息中间件的作用

    • 解耦:在项目启动之初来预测将来会碰到什么需要是极其困难的。消息中间件在处理过程中插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,这允许你独立地扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束即可
    • 冗余(存储):有些情况下,处理数据的过程会失败。消息中间件可以把数据进行持久化,直到它们已经被完全处理,通过这一方式可以规避数据丢失的风险
    • 扩展性:因为消息中间件解耦了应用的处理过程,所以提高消息入队和处理的效率是很容易的,只要另外增加处理过程即可,不需要改变代码,也不需要调节参数
    • 削峰:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入硬件资源,无疑是巨大的浪费。使用消息中间件使得关键组件能够支撑突发访问压力,不会因为突发的超负荷请求而完全崩溃
    • 可恢复性:当系统一部分组件失效时,不会影响到整个系统。消息中间件降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入消息中间件中的消息仍然可以在系统恢复后进行处理
    • 顺序保证:在大多数使用场景下,数据处理的顺序很重要,大部分消息中间件支持一定程度上的顺序性
    • 缓冲:在任何重要的系统中,都会存在需要不同处理时间的元素。消息中间件通过一个缓冲层来帮助任务最高效率地执行,写入消息中间件的处理会尽可能快速。该缓冲层有助于控制和优化数据流经过系统的速度
    • 异步通信:在很多时候,应用不想也不需要立即处理消息。消息中间件提供了异步处理机制,允许应用把一些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理

    三、RabbitMQ 的特点

    RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ 发展到今天,被越来越多的人认可,这和它在易用性、扩展性、可靠性等方面的卓著表现是分不开的,RabbitMQ 的具体特点可以概括为以下几点:

    • 可靠性:RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认及发布确认等
    • 灵活的路由:在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能,RabbitMQ 已经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件来实现自己的交换器
    • 扩展性:多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中的节点
    • 高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用
    • 多种协议:RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP、MQTT 等多种消息中间件协议
    • 多语言客户端:RabbitMQ 几乎支持所有常用语言,比如 Java、Python、Ruby、PHP、C#、JavaScript 等
    • 管理界面:RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等
    • 插件机制:RabbitMQ 提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件

    四、RabbitMQ 的安装及简单使用

    1.安装 Erlang

    第一步,解压安装包,并配置安装目录,这里我们预备安装到 /opt/erlang 目录下
    在这里插入图片描述
    第二步,如果出现类似关键报错信息:No curses library functions found。那么此时需要安装 ncurses,安装步骤如下(遇到提示输入 y 后直接回车即可)如下:
    在这里插入图片描述
    第三步,安装 Erlang:
    在这里插入图片描述
    如果在安装的过程中出现类似 “No ***** found” 的提示,可根据提示信息安装相应的包,之后再执行第二或者第三步,直到提示安装完毕为止

    第四步,修改 /etc/profile 配置文件,添加下面的环境变量:
    在这里插入图片描述
    最后执行如下命令让配置文件生效:
    在这里插入图片描述

    可以输入 erl 命令来验证 Erlang 是否安装成功
    在这里插入图片描述

    2.RabbitMQ 的安装

    RabbitMQ 的安装比 Erlang 的安装要简单,直接将下载的安装包解压到相应的目录下即可。本书撰稿时的最新版本为 3.6.12,本书示例大多采用同一系列的 3.6.x 版本

    这里选择将 RabbitMQ 安装到与 Erlang 同一目录(/opt)下面:
    在这里插入图片描述
    同样修改 /etc/profile 文件,添加下面的环境变量:
    在这里插入图片描述
    之后执行 source /etc/profile 命令让配置文件生效

    3.RabbitMQ 的运行

    在修改了 /etc/profile 配置文件之后,可以任意打开一个 Shell 窗口,输入以下命令以运行 RabbitMQ 服务:
    在这里插入图片描述
    在 rabbitmq-server 命令后面添加一个 “-detached” 参数是为了能够让 RabbitMQ 服务以守护进程的方式在后台运行,这样就不会因为当前 Shell 窗口的关闭而影响服务

    运行 rabbitmqctl status 命令可以查看 RabbitMQ 当前状态,是否正常启动
    在这里插入图片描述
    也可以通过 rabbitmqctl cluster_status 命令来查看集群信息,目前只有一个 RabbitMQ 服务节点,可以看作单节点的集群
    在这里插入图片描述

    4.生产和消费消息

    本节将演示如何使用 RabbitMQ Java 客户端生产和消费消息

    使用的 RabbitMQ Java 客户端版本为 4.2.1,相应的 maven 构建文件如下:

    <dependencies>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>4.2.1</version>
        </dependency>
    </dependencies>
    

    默认情况下,访问 RabbitMQ 服务的用户名和密码都是 “guest”,这个账户有限制,默认只能通过本地网络(如 localhost)访问,远程网络访问受限,所以在实现生产和消费消息之前,需要另外添加一个用户,并设置相应的访问权限
    在这里插入图片描述

    计算机的世界是从 “Hello World!” 开始的,首先生产者发送一条消息 “Hello World!” 至 RabbitMQ 中,之后由消费者消费。下面演示生产者客户端的代码:

    package com.sisyphus.rabbitmq.demo;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.MessageProperties;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class RabbitProducer {
        private static final String EXCHANGE_NAME = "exchange_demo";
        private static final String ROUTING_KEY = "routingkey_demo";
        private static final String QUEUE_NAME = "queue_demo";
        private static final String IP_ADDRESS = "192.168.0.2";
        private static final int PORT = 5672;   //RabbitMQ 服务端默认端口号为 5672
    
        public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost(IP_ADDRESS);
            factory.setPort(PORT);
            factory.setUsername("root");
            factory.setPassword("root123");
            Connection connection = factory.newConnection();    //创建连接
            Channel channel = connection.createChannel();       //创建信道
            //创建一个 type="direct"、持久化的、非自动删除的交换器
            channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
            //创建一个持久化、非排他的、非自动删除的队列
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            //将交换器与队列通过路由键绑定
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
            //发送一条持久化的消息:Hello World!
            String message = "Hello World!";
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
            //关闭资源
            channel.close();
            connection.close();
        }
    }
    

    上面的生产者客户端的代码首先和 RabbitMQ 服务器建立一个连接(Connection),然后在这个连接之上创建一个信道(Channel)。之后创建一个交换器(Exchange)和一个队列(Queue),并通过路由键进行绑定。然后发送一条消息,最后关闭资源

    消费者客户端代码:

    package com.sisyphus.rabbitmq.demo;
    
    import com.rabbitmq.client.AMQP;
    import com.rabbitmq.client.Address;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Consumer;
    import com.rabbitmq.client.DefaultConsumer;
    import com.rabbitmq.client.Envelope;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    public class RabbitConsumer {
        private static final String QUEUE_NAME = "queue_demo";
        private static final String IP_ADDRESS = "192.168.0.2";
        private static final int PORT = 5672;
    
        public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
            Address[] addresses = new Address[]{
                    new Address(IP_ADDRESS, PORT)
            };
            ConnectionFactory factory = new ConnectionFactory();
            factory.setUsername("root");
            factory.setPassword("root123");
            //这里的连接方式与生产者的 demo 略有不同,注意辨别区别
            Connection connection = factory.newConnection();    //创建连接
            final Channel channel = connection.createChannel(); //创建信道
            channel.basicQos(64);   //设置客户端最多接收未被 ack 的消息的个数
            Consumer consumer = new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag,
                                           Envelope envelope,
                                           AMQP.BasicProperties properties,
                                           byte[] body)
                    throws IOException{
                    System.out.println("recv message: " + new String(body));
                    try{
                        TimeUnit.SECONDS.sleep(1);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    channel.basicAck(envelope.getDeliveryTag(), false);
                }
            };
            channel.basicConsume(QUEUE_NAME, consumer);
            //等待回调函数执行完毕之后,关闭资源
            TimeUnit.SECONDS.sleep(5);
            channel.close();
            connection.close();
        }
    }
    
    展开全文
  • RabbitMQ实战指南学习

    2020-11-05 17:19:53
    一 AMQP协议 ...当autoAck设置为true时,rabbitmq会把发送出去的消息自动置为确认,然后从内存或者磁盘上删除。 当autoAck设置为false时,消费的消息分为两种状态,一种是等待投递的消息,一种是发送出去还没

    一 AMQP协议

    1 协议
    在这里插入图片描述

    二 消费模式

    1 服务端(broker)推送
    推模式采用Basic.consume进行消费,可以通过BasicQos设置一次性推送的消息数量。
    在这里插入图片描述

    2 消费端拉取
    拉模式采用Basic.Get进行消费,一次性只能获取一条消息。
    在这里插入图片描述

    三 消费端的确认与拒绝

    1 autoAck
    当autoAck设置为true时,rabbitmq会把发送出去的消息自动置为确认,然后从内存或者磁盘上删除。
    当autoAck设置为false时,消费的消息分为两种状态,一种是等待投递的消息,一种是发送出去还没有被确认的消息。注意,这里没有被确认的消息只会等到检测到消费者连接已经断开的时候才会重新投递,否则这条消息会一直等到消费者确认之后才被标记删除。目前rabbitmq不会给未被确认的消息设置过期时间。
    查看未被确认的消息是通过web页面的Ready(已发送)以及Unackonwledged(未确认)来查看。

    2 拒绝消息
    拒绝单条消息,basicReject(消息标识,是否重新入队分发);
    拒绝多条消息, basicNack(消息标识, 是否只拒收这一条消息(true表示这条消息之前的,本次接受的所有消息都拒收。false表示只拒收这一条消息), 是否重新入队分发)
    重发消息,basicRecover(是否让不同的消费者来消费这条消息(false表示还是自己消费))

    四 进阶

    1 mandatory与immediate参数
    首先注意rabbitmq3.0之后取消了对immediate的支持
    mandatory设置为true,在消息达到交换机之后,但交换机没有根据自身的类型或者路由键找到对应的队列,此时会通过Basic.Return命令触发生产者的ReturnCallBack。当mandatory设置为false时,会直接丢弃消息。
    immediate设置为true, 在经过交换机路由到队列之后,队列本身没有任何消费者,此时会通过Basic.Return命令触发生产者的ReturnCallBack,此时消息不会入队等待消费者。当immediate设置为false时,会存入队列等待消费者。

    2 备份交换机
    可以理解为简化了mandatory设置为true时的额外操作,当没有队列可达时会触发生产者的ReturnCallBack,这个时候还需要写处理这条消息的逻辑,而设置备份交换机之后,就不会触发ReturnCallBack逻辑了(即使mandatory=true也不会触发ReturnCallBack),而是直接路由到这个备份交换机,之后备份交换机的行为与普通交换机没有任何区别。
    路由交换机的声明方式与死信类似,只不过参数为alternate-exchange。因为找不到队列的消息被路由到备份交换机之后的行为与普通交换机没有任何区别,因此一般将备份交换机的类型设置为fanout,以保证肯定能被路由到某个队列中去。
    在这里插入图片描述

    3 过期时间
    设置队列中消息的过期时间:x-message-ttl(设置为0表示需要立刻投递,如果没有消费者或者投不出去则直接丢弃)
    在这里插入图片描述

    设置单条消息的过期时间:消息属性中设置expiration
    在这里插入图片描述

    设置队列的过期时间:x-expires,表示多长时间未被使用就被删除,而不是创建过后多长时间被删除。
    在这里插入图片描述
    在这里插入图片描述

    4 死信
    消息变成死信的几种情况
    ①消息被拒绝,并且是否重新入队参数设置为false
    ②消息过期
    ③队列达到了最大长度
    设置死信队列:x-dead-letter-exchange(设置死信交换机的名字),x-dead-letter-routing-key(设置路由到死信交换机时候的RoutingKey,如果不设置则用原消息的RoutingKey)
    在这里插入图片描述

    5 优先级队列
    优先级体现在消费速度比生产速度慢的时候才有意义,否则生产即被消费优先级就没有意义。
    队列优先级设置:x-max-priority 最小为0最大为10
    在这里插入图片描述

    消息优先级设置:priority属性,最小为0,最大为队列优先级设置的值
    在这里插入图片描述

    6 RPC
    在这里插入图片描述

    如图,主要通过两个属性来设置请求ID与响应队列。replayTo(队列名),由客户端提供,可以理解为生产者,指定消费者处理之后发送响应的队列名,一般是临时队列并且是每个生产者客户端独享的。请求ID可以直接用correlationId即可。
    客户端:
    在这里插入图片描述

    服务端:

    在这里插入图片描述

    7 持久化
    rabbitmq持久化分为三块(交换机与队列的持久化只会持久化本身的元数据,并不会对消息进行持久化):
    ①交换机的持久化,声明交换机时通过durable属性设置
    ②队列的持久化,声明队列时通过durable属性设置
    ③消息的持久化,将投递消息时候的BasicProperties中的DeliveryMode设置为2即可实现消息的持久化,但并不建议所有的消息都持久化,原因就是磁盘与内存的差距(springboot默认消息持久化的)。

    8 事务
    在这里插入图片描述

    9 发送方确认
    同步确认其实与事务模式没有特别大的区别,因为发送之后都需要等待数据落盘之后才会返回,区别在于事务需要commit与commitOK,而消息确认只需要一个ACK或者NACK。因此要想提升QPS就需要采用异步确认消息。即spring提供的confirmCallBack方法。

    在这里插入图片描述

    10 消费端注意
    默认是采用消息轮询的机制来分发消息,但是在消费端配置不均衡的情况下会产生消息堆积,因此可以设置消费端的消息上限
    basicQos(int prefetchSize(消息总大小,单位B), int prefetchCount(消息总条数), boolean global(默认false即可)) throws IOException;

    在这里插入图片描述

    11 消息传输的保证

    在这里插入图片描述
    在这里插入图片描述

    五 集群

    1 普通集群
    这种集群队列交换机什么的都是各个节点单独的,没有数据的互相备份,并且只建议在内网环境搭建,对延迟较敏感。通过将第一个机器的erlang.cookie中的值复制到其他机器下,然后分别启动各个节点,通过rabbitmqctl命令来操作集群的加入,注意:集群所有节点重启时,需要先重启最后一个停止的节点,否则会出错,解决方法就是重置集群然后重新挨个加入集群。

    2 Federation
    目的在于让消息可以在不同的broker之间传递而无需建立集群,主要是模拟建立一个本地(不是用户客户端,而是broker)的交换机或者队列,然后在这个交换机或者队列中建立一个针对远端broker的连接。业务所有的处理都在本地进行,之后再同步到远端的broker。
    在这里插入图片描述
    在这里插入图片描述

    3 Shovel
    简单来讲类似一个铲子,将一个队列的数据源源不断地发送到另一台broker的交换机。可以利用它来实现某个集群中消息堆积队列的数据按配置转移到另一个集群中。

    在这里插入图片描述

    六 高阶

    1 存储机制
    首先明确,rabbitmq消息设置持久化会被持久化到磁盘,但是消息没有设置持久化也会可能由于内存不足的原因持久化到磁盘,区别在于重启之后设置持久化的消息不会丢失,而没有设置持久化的消息即使被持久化了依然会丢失。
    在逻辑上来讲,消息分为两个部分,一个是索引即rabbit_queue_index(每个队列单独维护,包括数据的存储位置,是否被发送给消费者,是否ACK,是否落盘等),另一个是消息本身即rabbit_msg_store(由每个broker统一维护)。rabbit_msg_store从技术上又分为两部分,分别对应上面持久化持久化消息的msg_store_persistent,以及持久化非持久化消息的msg_store_transient。
    消息可以存储在rabbit_msg_store,也可以直接存储在rabbit_queue_index中。当消息大小小于queue_index_embed_msgs_below(默认为4096B,包括消息属性以及headers的总大小)时,存放在rabbit_queue_index中,在性能上得到优化。

    2 rabbit_queue_index
    每个rabbit_queue_index以顺序的段文件(从0开始的.idx文件)保存,每个段文件中包含固定数量SEGMRNT_ENTRY_COUNT(默认16384)条数据,并且每个队列都至少在内存中维护一个rabbit_queue_index段。

    3 rabbit_msg_store
    每个rabbit_msg_store也是以顺序的文件进行保存(从0开始的.rdq),每个文件最大大小由file_size_limit控制,在消息映射的时候,会在ETS(erlang term storge)表中映射index以及文件的相关信息。
    在读取消息的时候,会根据消息的mag_id找到对应的存储文件,如果文件存在并且没有被锁住,则直接打开读取,否则不存在或者被锁住则由rabbit_msg_store处理。
    消息的删除是在ETS上面删除消息的相关信息,并不会在文件中实际删除,当一个文件中都被标记删除之后这个文件就可以真正删除了。否则当检测到逻辑上相邻的两个文件可以合并在一个文件中,并且所有(这里指所有的消息)被标记删除的数量值与总的消息数量比达到阈值GARBAGE_FRACTION(默认0.5)之后才会将这两个文件进行合并。合并时先锁定这两个文件,然后清理第一个文件的垃圾,然后把第二个文件的有效数据写入第一个文件,最后再删除第二个文件。

    4 队列的结构
    队列由两部分组成,一部分rabbit_amqqueue_process(负责处理协议的相关消息,包括接收消息,发送消息,消息的确认等等),另一部分是backing_queue(消息的实际存储引擎,向rabbit_amqqueue_process提供接口调用)。
    如果投递的目标队列是空的并且有消费者订阅了这个队列,那么消息会被立刻转到消费者那里,并不会进入队列存储。否则则需要暂存队列等待处理,消息在队列中一般有四种状态:
    在这里插入图片描述

    对于持久化的消息,消息内容和索引都必须先存储到磁盘中,然后才有上面的四种状态中的一种,gamma消息是只有持久化的消息才有的状态。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5 惰性队列
    惰性队列会将消息直接持久化到磁盘,不会占用内存。适用于消息长时间得不到消费的情况。
    通过x_queue_mode来设置,默认是default,可以设置为lazy开启惰性队列。
    在这里插入图片描述

    6 磁盘内存警告
    内存:
    使用内存占总内存的百分比vm_memory_high_watermark (配置fraction默认0.4)超出后会阻断所有生产者的操作,使用内存总量vm_memory_high_watermark (配置absolute单位可以自定义)超出后会阻断所有生产者的操作。设置为0则表指禁止生产者发送消息。内存使用降低后阻塞解除。
    在磁盘或者内存预警时,会阻塞connection上的所有操作,因此应该尽量将消费者与生产者分开,使用不同的connection进行操作,当阻塞时,消费者的connection是可以正常操作的。
    当内存使用达到memory_high_watermark_paging_ratio时(默认0.5,表示达到设置内存最高值的0.5倍,假设总内存是4G, vm_memory_high_watermark=0.4,那么这个值的计算结果就是4GB0.40.5 = 800MB),会产生内存换页动作,即刷盘。
    磁盘:
    磁盘耗尽也会使生产者阻塞,通过disk_free_limit,可以直接设置固定的值,例如1G,也可以设置与内存的比例值,例如disk_free_limit:mem_relative:1.8,当磁盘还有总内存*1.8的大小之后告警。

    7 流控
    除了设置内存磁盘的空间之外,还可以提前通过流控来处理生产消费速率。erlang的每个进程都有一个进程邮箱,进程间的通信就是往邮箱里发信息,当消费速度过慢时邮箱越来越大,导致素色,从而影响上游进程的邮箱最终导致整个系统阻塞。
    流控采用的是信用证算法。即每个进程保存两个credit,一个是发给上游进程的凭证,一个是下游进程给自己发送的凭证。例如B发给C一个消息,则内部的credit_fromC减1,当为0时则不能再给C发消息,也不能接受A传过来的消息。credit_toA表示再接收多少条消息就给A发送增加credit的消息,此时A会增加自己的credit_fromB的值,当credit_fromB>0时,就可以给B发送消息了。
    在这里插入图片描述

    当流控产生的时候,connection被标记为flow,表示发送受限。流控不光再connection体现,只在channel以及队列上同样体现。当其中一块阻塞之后,上游的必定全部阻塞,因此可以通过这个找到性能交叉的那些地方,几个关键点如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    8 打破队列的瓶颈
    首先注意设置内存值与磁盘剩余量,然后一般情况下最容易在队列也就是rabbit_qmqqueue_process模块出现瓶颈,最方便的就是增加队列的数量,但不是类似于fanout的那种群发队列。而是direct交换机声明多个队列,然后根据不同的bindingkey绑定到不同的交换机上。在发送数据的时候随机bindingkey进行发送。消费者消费的时候监听这多个queue即可。这样可以实现消息队列的真正负载。但是消息是无序的。

    9 镜像队列(可以看其他资料重点了解,这里只简单记录)
    rabbit集群中各个队列还是只有一份数据,为了保证数据冗余可以开启镜像队列,会将队列的数据荣誉到其他broker上。如果客户端与slave建立连接,那slave会将存储或者消费的命令发给master,然后再由master执行完成之后返回给slave,slave在返回给客户端。这里slave不直接处理是因为master是针对单个队列存在的而不针对于整个broker,所以其本身其实已经起到了负载的功能。master宕机之后存活时间最长的slave将被选举为master。

    展开全文
  • 读书笔记第一章 RabbitMQ简介第二章 RabbitMQ入门第三章 客户端开发向导 第一章 RabbitMQ简介 消息队列中间件:利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。分为...
  • 基础 RoutingKey、BindingKey RoutingKey是生产者发消息给消费者的时候指定的,BindingKey是交换器和队列绑定时设置的,两者匹配,就会进行消息传递 队列声明 queueDeclare (String queue , boolean durable , ...
  • 相关概念 RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。可以把消息传递的过程想象成∶ 当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过... 参考文章 博客整理自《RabbitMQ实战指南
  • 本文摘录总结自《RabbitMQ实战指南》。 一、消息中间件 消息队列中间件(MessageQueueMiddleware,简称为MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它...
  • 第1章 RabbitMQ简介 第2章 RabbitMQ入门 第3章 客户端开发向导 第4章 RabbitMQ进阶 第5章 RabbitMQ管理 第6章 RabbitMQ配置 第7章 RabbitMQ运维 7.3 单节点故障恢复 第8章 跨越集群的界限 第9章 RabbitMQ高...
  • RabbitMQ实战指南PDF

    千次阅读 2020-03-21 11:28:44
    https://share.weiyun.com/5z6Ow6i
  • 如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器,这样可以将未被路由的消息存储在RabbitMQ中,再在需要的时候去处理这些消息。 可以通过在声明交换器(调用channel.exchangeDeclare...
  • import java.util.concurrent.C 【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】 开源分享完整内容戳这里 ountDownLatch; import java.util.concurrent.ExecutorService; import ...
  • 对于 RabbitMQ 来说,一个 RabbitMQ Broker 可 以 简单地看作 一个 RabbitMQ 服务节点 ,或者 RabbitMQ 服务实例 。 大多 数情况下 也可 以 将一个 RabbitMQ Broker 看作一 台 RabbitMQ 服务器 。 生产者将消息...
  • RabbitMQ实战指南》笔误及改进记录

    万次阅读 热门讨论 2017-12-12 20:09:51
    2017年12月上旬笔者的一本新书——《RabbitMQ实战指南》上架,里面的校稿都是自己独自完成的,一共进行了15遍,但还是会有漏网之鱼。本篇博文用来记录现在发现的一些笔误,一是给购书的朋友一个参考,以防被笔误所...
  • 什么是消息中间件 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON等,也可以很复杂,比如内嵌对象。...【RabbitMQ实战指南】第1章 RabbitMQ简介 ! 
  • RabbitMQ 单机 消息发送定制 mandatory true:如果 exchange 根据自身类型和消息 routeKey 无法找到一个符合条件的 queue,那么会调用 basic.return 方法将消息返还给生产者。 false:...
  • 花了接近2周时间看了一下RabbitMQ,感觉收货很多,顺便也晒一下这2周的劳动成果 00 RabbitMQ概述 01 消息中间件的概述 02 RabbitMQ环境搭建:centos7+RabbitMQ-3.6.9 03 RabbitMQ的简单使用,及整合Spring Boot 04 ...
  • RabbitMQ实战视频.zip

    2020-03-19 10:23:02
    在此,我精心录制的这一套视频教程将几乎手把手指导大家入门学习RabbitMQ并将所学的知识要点实战到实际的业务场景中,特别是在第二阶段的学习,将采用SpringBoot整合RabbitMQ的方式来实战实际的业务场景,并用来解决...
  • 1、死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器。当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是...当这个队列中存在死信时,RabbitMQ就会自...
  • RabbitMQ使用指南.pdf

    2021-04-29 10:25:27
    RabbitMQ下载安装配置使用指南官方手册
  • RabbitMQ

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,686
精华内容 1,474
关键字:

rabbitmq实战指南