【退役之重学Java】如何处理消息丢失问题

2024-05-10 00:04

本文主要是介绍【退役之重学Java】如何处理消息丢失问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

即如何保证消息的可靠性传输

一、场景

  1. 网络丢包,导致丢失消息
  2. RabbitMQ 没来得及保存消息,就挂掉了
  3. 消费者接受到消息,但没处理完,消费者挂掉了

二、怎么办

  1. 生产者
    将 channel 设置为 confirm 模式,是异步模式,不会阻塞
  2. RabbitMQ
    • queue 设置为持久化的(保证 RabbitMQ 持久化 queue 的元数据);
    • 发送消息的时候将消息的 deliveryMode 设置为2(保证消息持久化)
    • 此时 RabbitMQ 就会将消息持久化到磁盘上去。
    • 持久化可以跟生产者那边的 confirm 机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者 ack,所以哪怕实在持久化到磁盘之前,RabbitMQ 挂了,数据丢了,生产者收不到 ack, 你也是可以自己重发的。
    • 哪怕是你给RabbitMQ 开启了持久化机制,也有一种可能,就是这个消息写到了 RabbitMQ 中,但是还没来得及持久化到磁盘上,结果不巧,此时 RabbitMQ 挂了,就会导致内存里的一点数据会丢失
  3. 消费者
    如果打开了消费者的 autoAck 机制,消费到数据之后(还没有消费完),消费者会自动通知 RabbitMQ,已经消费完这条消息了。
    就是说,如果你消费到一条消息,还在处理中,autoAck 机制会自动告诉 RabbitMQ 已经消费完了。这是如果消费者系统宕机,就会丢失消息
    所以说,消费者方面需要关闭 autoAck,而手动 Ack。

这篇关于【退役之重学Java】如何处理消息丢失问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974867

相关文章

YOLOv3实践darknet跑voc数据集的问题

最近在用YOLOv3的darknet训练VOC数据集,初学小白的我对参数,源码还在了解层面,但是结果已经训练开始之后发现IoU出现了nan值循环。所以就开始网上寻找。总结在下: 参考:https://blog.csdn.net/lilai619/article/details/79695109#commentsedit 如何训练自己的数据 说明: (1)平台 linux + 作者官方代码

Leetcode——爬楼梯(动态规划问题)

70.爬楼梯 描述 假设你正在爬楼梯。需要 n 步你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例1 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1 步 + 1 步2 步 示例2 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1 步 + 1 步 + 1 步1 步 + 2 步2 步

图像数据不足时的处理方法

一个模型所能提供的信息一般来源于两个方面,一是训练数据中蕴含的信息;二是在模型的形成过程中(构造,学习,推理),人们提供的先验信息。训练数据不足时,说明模型从从原始信息获取的信息比较少,要想保证效果,就要更多的先验信息。先验信息可以作用在模型上,例如让模型采用特定的内在结构,条件假设;先验信息也可以直接施加在数据集上,即根据特定的先验假设去调整,变换或扩展训练数据,让其展现出更多更有用的信息,以利

java设计模式之工厂模式--普通工厂方法模式(Factory Method)

1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 2.先定义一个接口: package com.zhong.pattern.factorymethod;/*** 发送接口* @author admin**/public interface Sender {/*** 发送消息方法* @param msg*/void send(String msg);} 3

Java设计模式之代理模式2-动态代理(jdk实现)

这篇是接着上一篇继续介绍java设计模式之代理模式。下面讲解的是jdk实现动态代理。 1.)首先我们要声明一个动态代理类,实现InvocationHandler接口 package com.zhong.pattern.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/*** 演

java设计模式之代理模式1--静态代理

Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生活中的这么一个概念:助手。 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 1.)首先新建一个表演的接口 package com.zhong.pattern.proxy;/*** 表演接口* @author admin*

java原型(Prototype)设计模式

原型模式就是讲一个对象作为原型,使用clone()方法来创建新的实例。 public class Prototype implements Cloneable{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overri

Java中23种设计模式之适配者模式

适配器模式的作用就是在原来的类上提供新功能。 主要可分为3种: 1.类适配:创建新类,继承源类,并实现新接口,例如:     class Adapter extends OldClass implements NewFunc{} 2.对象适配:创建新类持源类的实例,并实现新接口,例如:     class Adapter implements NewFunc { priva

java不依赖临时变量交换两个变量的值

java不依赖临时变量交换两个变量的值 1.简单易懂的实现方式     int a=1,b=2;     int temp = 0;     temp = a;     a = b;     b= temp; 2.算术算法 int a=1,b=2; a = a+b;// a = 1+2  b = a-b;// b = a-b --> b=3-2 -->1 a = a -b;/

Java中的SOLID原则及示例

类是任何Java应用程序的构建块。如果这些区块不强,那么建筑(即应用)将来将面临艰难时期。这实际上意味着,当应用程序范围上升或应用程序在生产或维护中面临某些设计问题时,不那么好的编写会导致非常困难的情况。 另一方面,一组精心设计和编写的类可以加速编码过程的突飞猛进,同时减少错误的数量。 在本教程中,我们将使用 5个最推荐的设计原则的示例来讨论Java中的SOLID原则,在编写类时我们应该记住这