![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
RabbitMQ
文章平均质量分 77
RabbitMQ
我叫向同学
永远不要停下前进的脚步
展开
-
RabbitMQ集群实现镜像队列(高可用)
镜像队列为什么要使用镜像?如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过 publisherconfirm 机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此, 一般不希望遇到因单点故障导致的服务不可用。引入镜原创 2021-12-14 17:24:35 · 3642 阅读 · 0 评论 -
基于CentIOS7搭建RabbitMQ 集群
集群(clustering)为什么要使用clustering最开始我们介绍了如何安装及运行 RabbitMQ 服务,不过这些是单机版的,无法满足目前真实应用的要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台 RabbitMQ服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要 RabbitMQ 服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ 务的性能显得捉襟见肘,搭建一个 RabbitMQ 集群才是解决实际问题原创 2021-12-12 18:55:30 · 1450 阅读 · 0 评论 -
Springboot整合RabbitMQ之惰性队列
使用场景RabbitMQ 从 3.6.0 版本开始引入了惰性队列的概念。惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致使长时间内不能消费消息造成堆积时,惰性队列就很有必要了。默认情况下,当生产者将消息发送到 RabbitMQ 的时候,队列中的消息会尽可能的存储在内存之中,这样可以更加快速的将消息发送给消费者。即使是持久化的原创 2021-12-12 17:02:14 · 552 阅读 · 0 评论 -
Springboot整合RabbitMQ优先级队列
使用场景在我们订单系统中有一个订单催付的场景,我们的客户在天猫下的订单,会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,天猫商家对我们来说,肯定是要分大客户和小客户的对吧,比如像苹果,小米这样大商家一年起码能给我们创造很大的利润,所以理应当然,他们的订单必须得到优先处理,而曾经我们的后端系统是使用 redis 来存放的定时轮询,大家都知道 redis 只能用 List 做一个简简单单的消息队列,并不能实现一个优先级的场景,所以订单量大了后采用原创 2021-12-12 11:00:16 · 962 阅读 · 16 评论 -
RabbitMQ备份交换机
接上一篇SpringBoot整合RabbitMQ消息发布确认(二)生产者获得了对无法投递消息的感知能力,能够在生产者的消息无法被投递时发现并处理。但有时候,我们并不知道该如何处理这些无法路由的消息,最多打个日志,然后触发报警,再来手动处理。而通过日志来处理这些无法路由的消息是很不优雅的做法,特别是当生产者所在的服务有多台机器的时候,手动复制日志会更加麻烦而且容易出错。而且设置 mandatory 参数会增加生产者的复杂性,需要添加处理这些被退回的消息的逻辑。如果既不想丢失消息,又不想增加生产者的复杂性,原创 2021-12-11 13:08:22 · 1338 阅读 · 0 评论 -
SpringBoot整合RabbitMQ消息发布确认(二)
前面有一篇文章测试一下发布确认RabbitMQ消息发布确认现在有一个问题:在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。 于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢?特别是在这样比较极端的情况, RabbitMQ 集群不可用的时候,无法投递的消息该如何处理呢?确认机制方案代码架构图配置文件在配置文件当中需要添加spring.rabbitmq.publisher-co原创 2021-12-10 22:39:11 · 1199 阅读 · 4 评论 -
使用RabbitMQ 插件实现延迟队列
接着上一篇。SpringBoot整合RabbitMQ实现延迟队列了解到在消息属性上设置 TTL 的方式,消息可能并不会按时“死亡“,因为 RabbitMQ 只会检查第一个消息是否过期,如果过期则丢到死信队列,如果第一个消息的延时时长很长,而第二个消息的延时时长很短,第二个消息并不会优先得到执行,这就是用死信做延迟队列的一个缺陷。如果不能实现在消息粒度上的 TTL,并使其在设置的 TTL 时间及时死亡,就无法设计成一个通用的延时队列。那如何解决呢,接下来我们就去解决该问题。安装延时队列插件在官网上下原创 2021-12-10 16:49:37 · 5419 阅读 · 6 评论 -
SpringBoot整合RabbitMQ实现延迟队列
延迟队列是什么延时队列的队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。延迟队列使用场景订单在十分钟之内未支付则自动取消新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。用户注册成功后,如果三天内没有登陆则进行短信提醒。用户发起退款,如果三天内没有得到处理则通知相关运营人员。预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议这些场景都有原创 2021-12-08 22:44:10 · 1541 阅读 · 2 评论 -
RabbitMQ的死信队列
什么是死信先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说, producer 将消息投递到 broker 或者直接到 queue 里了, consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列原创 2021-12-06 22:36:25 · 541 阅读 · 0 评论 -
RabbitMQ交换机的类型
在前几篇文章中,我们创建了一个工作队列。 我们假设的是工作队列背后, 每个任务都恰好交付给一个消费者(工作进程)。在这一次,我们将做一些完全不同的事情-我们将消息传达给多个消费者。这种模式称为 ”发布/订阅”。为了说明这种模式,我们将构建一个简单的日志系统。它将由两个程序组成:第一个程序将发出日志消息,第二个程序是消费者。 其中我们会启动两个消费者,其中一个消费者接收到消息后把日志存储在磁盘,另外一个消费者接收到消息后把消息打印在屏幕上,事实上第一个程序发出的日志消息将广播给所有消费者。Exchang原创 2021-12-05 23:13:20 · 661 阅读 · 0 评论 -
RabbitMQ消息发布确认
发布确认原理生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式, 所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后, broker就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出, broker 回传给生产者的确认消息中 delivery-tag 域包含了确认消息的序列号,此外 broker 也可以设置basi原创 2021-12-05 13:50:42 · 2430 阅读 · 1 评论 -
RabbitMQ消息和队列的持久化
持久化的概念上一篇测试已经看到了如何处理任务不丢失的情况,但是如何保障当 RabbitMQ 服务停掉以后消息生产者发送过来的消息不丢失。默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事: 我们需要将队列和消息都标记为持久化。队列持久化前几次的测试我们创建的队列都是非持久化的, rabbitmq 如果重启的化,该队列就会被删除掉,如果要队列实现持久化 需要在声明队列的时候把 durable 参数设置为持久化。但是需要原创 2021-12-04 20:48:37 · 3766 阅读 · 0 评论 -
测试RabbitMQ消息应答(手动档,自动挡)
概念消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况。 RabbitMQ 一旦向消费者传递了一条消息,便立即将该消息标记为删除。在这种情况下,突然有个消费者挂掉了,我们将丢失正在处理的消息。以及后续发送给该消费这的消息,因为它无法接收到。为什么会有这个概念?为了保证消息在发送过程中不丢失, rabbitmq 引入消息应答机制,消息应答就是:消费者在接收到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了, rabbitmq 可原创 2021-12-02 21:55:55 · 1544 阅读 · 0 评论 -
测试RabbitMQ工作队列是如何工作的
Work Queues工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。 当有多个工作线程时,这些工作线程将一起处理这些任务。一条消息只能被处理一次,不可以处理多次。代码实现-轮训分发消息在这个案例中我们会启动两个工作线程,一个消息发送线程,我们来看看他们两个工作线程是如何工作的。抽取工具类import com.rabbitmq.client.Ch原创 2021-12-01 22:09:35 · 136 阅读 · 0 评论 -
快速搭建RabbitMQ的Java环境测试生产和消费
POM文件 <!--指定 jdk 编译版本--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId>原创 2021-11-30 23:05:25 · 1040 阅读 · 0 评论 -
CentOS7安装RabbitMQ 详细步骤
安装下载地址 https://www.rabbitmq.com/download.html基于Docker安装就特别简单了,就不做演示了复制下面你的代码即可运行。# for RabbitMQ 3.8,# 3.8.x support timeline: https://www.rabbitmq.com/versions.htmldocker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.8-manageme原创 2021-11-30 21:30:56 · 1627 阅读 · 0 评论 -
RabbitMQ是什么?一些简单的概念
概念RabbitMQ 是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑 RabbitMQ 是一个快递站,一个快递员帮你传递快件。 RabbitMQ 与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。四大核心概念生产者产生数据发送消息的程序是生产者交换机交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须原创 2021-11-29 22:08:38 · 2693 阅读 · 0 评论 -
MQ的分类你知道么?项目中如何选型MQ?
MQ的分类消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。ActiveMQ是一款非常古老的MQ,太老了 ,我也就不多说了优点: 单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据缺点:官方社区现在对 ActiveMQ原创 2021-11-29 20:44:53 · 1774 阅读 · 0 评论 -
什么是MQ?(理论知识)
MQ是什么MQ(message queue),从字面意思上看,本质上就是一个队列, FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中, MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。为什么要使用MQ主要有几个作用流量消峰举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返原创 2021-11-29 20:23:11 · 4084 阅读 · 0 评论