先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
正文
- 生产者发送消息丢失:发送消息到 RabbitMQ Server 异常。 可能因为网络问题造成 RabbitMQ 服务端无法收到消息。——解决方案:ConfirmCallback
- 生产者发送消息丢失:消息无法路由到指定队列。 可能由于代码层面或配置层面错误导致消息路由到指定队列失败。——解决方案:ReturnCallback
- RabbitMQ Server 存储消息丢失:消息未完全持久化到磁盘。 可能因为 RabbitMQ 宕机导致消息未完全持久化,或队列丢失从而导致消息丢失等持久化问题。——解决方案:集群部署,实现高可用
- 消费者消费消息丢失:消费者消费消息异常。 可能在消费者接收消息后,还没来得及消费消息,消费者就发生宕机、故障等问题。——解决方案:消费端手动确认消息
二、交换机的持久化
方式一:直接 new
直接实例化对应的 Exchange
实现类即可,默认:持久化的、非自动删除的。
@Bean
public DirectExchange directExchange() {
return new DirectExchange(directExchange);
}
Exchange
源码:
package org.springframework.amqp.core;
public abstract class AbstractExchange extends AbstractDeclarable implements Exchange {
...
public AbstractExchange(String name) {
// 默认是持久化的、非自动删除的。
this(name, true, false);
}
...
}
方式二:channel.exchangeDeclare()
在 RabbitMQ 的原生 API 中,例如:Java 客户端 API,声明持久化交换机时,需要将 durable
参数设置为 true
:
// 声明交换机:(交换机名称,交换机类型,持久化)
channel.exchangeDeclare("myExchange", "direct", true);
方式三:ExchangeBuilder【推荐】
在 Spring AMQP 中,我们可以使用 ExchangeBuilder
来创建持久化的交换机:
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
Exchange exchange = ExchangeBuilder.directExchange("myExchange")
.durable(true) // 交换机持久化
.build();
三、队列的持久化
方式一:直接 new
直接实例化 Queue
类即可,默认:持久化的、非独占的、非自动删除的。
@Bean
public Queue myQueue() {
return new Queue("myQueue");
}
Queue
源码:
package org.springframework.amqp.core;
public Queue(String name) {
// 默认是持久化的、非独占的、非自动删除的。
this(name, true, false, false);
}
方式二:channel.queueDeclare()
在原生 RabbitMQ API 中,例如 Java 客户端 API,声明持久化队列时,需要将 durable
参数设置为 true
:
// 声明队列:(队列名称,持久化,非独占,非自动删除,可选队列参数)
channel.queueDeclare("myQueue", true, false, false, null);
方式三:QueueBuilder【推荐】
在 Spring AMQP 中,可以使用 QueueBuilder
来创建持久化的队列:
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
Queue queue = QueueBuilder.durable("myQueue").build();
四、消息的持久化
即使队列时持久化的,发送到队列中的消息 默认是持久化的。我们也可以手动配置使消息持久化,需要在发送消息时设置消息属性为持久化。
RabbtTemplate.java 源码:
package org.springframework.amqp.rabbit.core;
public class RabbitTemplate extends RabbitAccessor implements BeanFactoryAware, ... {
...
// 没有手动指定MessagePostProcessor时
@Override
public void convertAndSend(String exchange, String routingKey, final Object object,
@Nullable CorrelationData correlationData) throws AmqpException {
send(exchange, routingKey, convertMessageIfNecessary(object), correlationData);
}
// 初始化MessageProperties
protected Message convertMessageIfNecessary(final Object object) {
if (object instanceof Message) {
return (Message) object;
}
return getRequiredMessageConverter().toMessage(object, new MessageProperties());
}
...
}
MessageProperties.java 源码:
package org.springframework.amqp.core;
public class MessageProperties implements Serializable {
...
// 消息默认为持久化
public static final MessageDeliveryMode DEFAULT\_DELIVERY\_MODE = MessageDeliveryMode.PERSISTENT;
private MessageDeliveryMode deliveryMode = DEFAULT\_DELIVERY\_MODE;
...
}
方式一:channel.basicPublish()
在原生 RabbitMQ API 中,例如 Java 客户端 API,声明持久化消息时,需要将 deliveryMode
参数设置为 2
:
import com.rabbitmq.client.AMQP;
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.deliveryMode(2) // 这里2对应MessageDeliveryMode.PERSISTENT
.build();
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/2d270130824216a28752128fc1cee63c.png)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-TgB8mfZV-1713321361383)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**