相关视频地址:https://www.bilibili.com/video/BV1cb4y1o7zz?p=8314.1、clustering1)使用集群的原因最开始我们介绍了如何安装及运行RabbitMQ服务,不过这些是单机版的,无法满足目前真实应用的要求。如果RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量,那么如果应用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机RabbitMQ务的性能显得捉襟见肘,搭建一个RabbitMQ集群才是解决实际问题的关键。2)搭建步骤修改3
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=7913.1、幂等性1)概念用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等。2)消息重复消费消费者在消费MQ中的消
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=71在生产环境中由于一些不明原因,导致rabbitmq重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行RabbitMQ的消息可靠投递呢?特别是在这样比较极端的情况,RabbitMQ集群不可用的时候,无法投递的消息该如何处理呢:应用[xxx]在[08-1516:36:04]发生[错误日志异常],alertId=[xxx]。由[org.springframework.amqp.rabbit.listener.BlockingQu
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=5611.1、延迟队列概念延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。11.2、延迟队列使用场景订单在十分钟之内未支付则自动取消新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。用户注册成功后,如果三天内没有登陆则进行短信提醒。用户发起退款,如果三天内没有得到处理则通知相关运营人员。预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加
10.1、死信的概念先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到broker或者直接到queue里了,consumer从queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。应用场景:为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中;还有比如说:用户在商城下单成功并点击去支付后在指定时间未支付时自动失效10.2、死信的来源(3种)消息TTL
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=39在上一节中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情-我们将消息传达给多个消费者。这种模式称为”发布/订阅”。为了说明这种模式,我们将构建一个简单的日志系统。它将由两个程序组成:第一个程序将发出日志消息,第二个程序是消费者。其中我们会启动两个消费者,其中一个消费者接收到消息后把日志存储在磁盘,另外一个消费者接收到消息后把消息打印在屏幕上,事实上第一个程序发出的日志消息将广播给所有消费者。9.1、E
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=328.1、发布确认原理生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker回传给生产者的确认消息中delivery-tag域包含了确认消息的序列号,此外broker也可以设置basic.ac
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=287.1、概念刚刚我们已经看到了如何处理任务不丢失的情况,但是如何保障当RabbitMQ服务停掉以后消息生产者发送过来的消息不丢失。默认情况下RabbitMQ退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事:我们需要将队列和消息都标记为持久化。7.2、队列如何实现持久化之前我们创建的队列都是非持久化的,rabbitmq如果重启的化,该队列就会被删除掉,如果要队列实现持久化需要在声明队列的时候把durable参数设置为持久化但是需要注意的就是如果之
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=226.1、概念消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况。RabbitMQ一旦向消费者传递了一条消息,便立即将该消息标记为删除。在这种情况下,突然有个消费者挂掉了,我们将丢失正在处理的消息。以及后续发送给该消费这的消息,因为它无法接收到。为了保证消息在发送过程中不丢失,rabbitmq引入消息应答机制,消息应答就是:消费者在接收到消息并且处理该消息之后,告诉rabbitmq它已经处理了,rabbitmq可以把该消息删除了
一个队列可以有多个消费者,多个消费者分摊消费这个队列中的消息。下面通过案例演示:在这个案例中我们会启动两个工作线程,一个消息发送线程,我们来看看他们两个工作线程是如何工作的。1)抽取工具类publicclassRabbitMqUtils{//得到一个连接的channelpublicstaticChannelgetChannel()throwsException{//创建一个连接工厂ConnectionFactoryfactory=newConnectionFactory();factory.setHost("182.92.234.71");factory.setUserna
在这一部分中,我们将用Java编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。我们将介绍JavaAPI中的一些细节。在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区4.1、依赖<!--指定jdk编译版本--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifac
对应视频:https://www.bilibili.com/video/BV1cb4y1o7zz?p=103.1、官网地址https://www.rabbitmq.com/download.html3.2、文件上传上传到/usr/local/software目录下(如果没有software需要自己创建)3.3、安装文件(分别按照以下顺序安装)rpm-ivherlang-21.3-1.el7.x86_64.rpmyuminstallsocat-yrpm-ivhrabbitmq-server-3.8.8-1.el7.noarch.rpm3.4、常用命令(按照以下顺序执行)1)添加开机启动Rabbi
2.1、RabbitMQ概念RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。2.2、四大核心概念1)生产者(Producer)产生数据发送消息的程序是生产者2)交换机(Exchange)交换机是RabbitMQ非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将
本教程对应的视频:https://www.bilibili.com/video/BV1cb4y1o7zz源文档地址链接:https://pan.baidu.com/s/1C9MTpu5Ikk-IK1OklykPMA提取码:yyds1.1、什么是MQMQ(messagequeue),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。1.2、为什么要用MQ1)流量消峰举个