RocketMQ批量消费、消息重试、消费模式、刷盘方式

RocketMQ(22) -- RocketMQ应用 -- 批量消费消息 RocketMQ应用 -- 批量消费消息 阅读详情

转载:  https://blog.youkuaiyun.com/u010634288/article/details/56049305


一、Consumer 批量消费

可以通过

[java]  view plain  copy
  1. consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条  
这里需要分为2种情况1、Consumer端先启动  2、Consumer端后启动.   正常情况下:应该是Consumer需要先启动

1、Consumer端先启动

Consumer代码如下

[java]  view plain  copy
  1. package quickstart;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;  
  6. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;  
  7. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;  
  8. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  9. import com.alibaba.rocketmq.client.exception.MQClientException;  
  10. import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;  
  11. import com.alibaba.rocketmq.common.message.MessageExt;  
  12.   
  13. /** 
  14.  * Consumer,订阅消息 
  15.  */  
  16. public class Consumer {  
  17.   
  18.     public static void main(String[] args) throws InterruptedException, MQClientException {  
  19.         DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");  
  20.         consumer.setNamesrvAddr("192.168.100.145:9876;192.168.100.146:9876");  
  21.         consumer.setConsumeMessageBatchMaxSize(10);  
  22.         /** 
  23.          * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br> 
  24.          * 如果非第一次启动,那么按照上次消费的位置继续消费 
  25.          */  
  26.         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);  
  27.   
  28.         consumer.subscribe("TopicTest", "*");  
  29.   
  30.         consumer.registerMessageListener(new MessageListenerConcurrently() {  
  31.   
  32.             public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {  
  33.                   
  34.                 try {  
  35.                     System.out.println("msgs的长度" + msgs.size());  
  36.                     System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);  
  37.                 } catch (Exception e) {  
  38.                     e.printStackTrace();  
  39.                     return ConsumeConcurrentlyStatus.RECONSUME_LATER;  
  40.                 }  
  41.                   
  42.                   
  43.                   
  44.                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;  
  45.             }  
  46.         });  
  47.   
  48.         consumer.start();  
  49.   
  50.         System.out.println("Consumer Started.");  
  51.     }  
  52. }  





由于这里是Consumer先启动,所以他回去轮询MQ上是否有订阅队列的消息,由于每次producer插入一条,Consumer就拿一条所以测试结果如下(每次size都是1):




2、Consumer端后启动,也就是Producer先启动

由于这里是Consumer后启动,所以MQ上也就堆积了一堆数据,Consumer的

consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条    

所以这段代码就生效了测试结果如下(每次size最多是10):


二、消息重试机制:消息重试分为2种1、Producer端重试 2、Consumer端重试

1、Producer端重试 

也就是Producer往MQ上发消息没有发送成功,我们可以设置发送失败重试的次数

[java]  view plain  copy
  1. package quickstart;  
  2.   
  3. import com.alibaba.rocketmq.client.exception.MQClientException;  
  4. import com.alibaba.rocketmq.client.producer.DefaultMQProducer;  
  5. import com.alibaba.rocketmq.client.producer.SendResult;  
  6. import com.alibaba.rocketmq.common.message.Message;  
  7.   
  8. /** 
  9.  * Producer,发送消息 
  10.  *  
  11.  */  
  12. public class Producer {  
  13.     public static void main(String[] args) throws MQClientException, InterruptedException {  
  14.         DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");  
  15.         producer.setNamesrvAddr("192.168.100.145:9876;192.168.100.146:9876");  
  16.         producer.setRetryTimesWhenSendFailed(10);//失败的 情况发送10次  
  17.         producer.start();  
  18.   
  19.         for (int i = 0; i < 1000; i++) {  
  20.             try {  
  21.                 Message msg = new Message("TopicTest",// topic  
  22.                         "TagA",// tag  
  23.                         ("Hello RocketMQ " + i).getBytes()// body  
  24.                 );  
  25.                 SendResult sendResult = producer.send(msg);  
  26.                 System.out.println(sendResult);  
  27.             } catch (Exception e) {  
  28.                 e.printStackTrace();  
  29.                 Thread.sleep(1000);  
  30.             }  
  31.         }  
  32.   
  33.         producer.shutdown();  
  34.     }  
  35. }  




2、Consumer端重试

2.1、exception的情况,一般重复16次 10s、30s、1分钟、2分钟、3分钟等等

上面的代码中消费异常的情况返回

return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试

正常则返回:

return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//成功


[java]  view plain  copy
  1. package quickstart;  
  2.   
  3.   
  4. import java.util.List;  
  5.   
  6. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;  
  7. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;  
  8. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;  
  9. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  10. import com.alibaba.rocketmq.client.exception.MQClientException;  
  11. import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;  
  12. import com.alibaba.rocketmq.common.message.MessageExt;  
  13.   
  14. /** 
  15.  * Consumer,订阅消息 
  16.  */  
  17. public class Consumer {  
  18.   
  19.     public static void main(String[] args) throws InterruptedException, MQClientException {  
  20.         DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");  
  21.         consumer.setNamesrvAddr("192.168.100.145:9876;192.168.100.146:9876");  
  22.         consumer.setConsumeMessageBatchMaxSize(10);  
  23.         /** 
  24.          * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br> 
  25.          * 如果非第一次启动,那么按照上次消费的位置继续消费 
  26.          */  
  27.         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);  
  28.   
  29.         consumer.subscribe("TopicTest", "*");  
  30.   
  31.         consumer.registerMessageListener(new MessageListenerConcurrently() {  
  32.   
  33.             public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {  
  34.   
  35.                 try {  
  36.                     // System.out.println("msgs的长度" + msgs.size());  
  37.                     System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);  
  38.                     for (MessageExt msg : msgs) {  
  39.                         String msgbody = new String(msg.getBody(), "utf-8");  
  40.                         if (msgbody.equals("Hello RocketMQ 4")) {  
  41.                             System.out.println("======错误=======");  
  42.                             int a = 1 / 0;  
  43.                         }  
  44.                     }  
  45.   
  46.                 } catch (Exception e) {  
  47.                     e.printStackTrace();  
  48.                     if(msgs.get(0).getReconsumeTimes()==3){  
  49.                         //记录日志  
  50.                           
  51.                         return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功  
  52.                     }else{  
  53.                           
  54.                     return ConsumeConcurrentlyStatus.RECONSUME_LATER;// 重试  
  55.                     }  
  56.                 }  
  57.   
  58.                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功  
  59.             }  
  60.         });  
  61.   
  62.         consumer.start();  
  63.   
  64.         System.out.println("Consumer Started.");  
  65.     }  
  66. }  

打印结果:




假如超过了多少次之后我们可以让他不再重试记录 日志。

if(msgs.get(0).getReconsumeTimes()==3){
//记录日志  
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功
}


2.2超时的情况,这种情况MQ会无限制的发送给消费端。

就是由于网络的情况,MQ发送数据之后,Consumer端并没有收到导致超时。也就是消费端没有给我返回return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;这样的就认为没有到达Consumer端。

这里模拟Producer只发送一条数据。consumer端暂停1分钟并且不发送接收状态给MQ

[java]  view plain  copy
  1. package model;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;  
  6. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;  
  7. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;  
  8. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  9. import com.alibaba.rocketmq.client.exception.MQClientException;  
  10. import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;  
  11. import com.alibaba.rocketmq.common.message.MessageExt;  
  12.   
  13. /** 
  14.  * Consumer,订阅消息 
  15.  */  
  16. public class Consumer {  
  17.   
  18.     public static void main(String[] args) throws InterruptedException, MQClientException {  
  19.         DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");  
  20.         consumer.setNamesrvAddr("192.168.100.145:9876;192.168.100.146:9876");  
  21.         consumer.setConsumeMessageBatchMaxSize(10);  
  22.         /** 
  23.          * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br> 
  24.          * 如果非第一次启动,那么按照上次消费的位置继续消费 
  25.          */  
  26.         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);  
  27.   
  28.         consumer.subscribe("TopicTest", "*");  
  29.   
  30.         consumer.registerMessageListener(new MessageListenerConcurrently() {  
  31.   
  32.             public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {  
  33.   
  34.                 try {  
  35.   
  36.                     // 表示业务处理时间  
  37.                     System.out.println("=========开始暂停===============");  
  38.                     Thread.sleep(60000);  
  39.   
  40.                     for (MessageExt msg : msgs) {  
  41.                         System.out.println(" Receive New Messages: " + msg);  
  42.                     }  
  43.   
  44.                 } catch (Exception e) {  
  45.                     e.printStackTrace();  
  46.                     return ConsumeConcurrentlyStatus.RECONSUME_LATER;// 重试  
  47.                 }  
  48.   
  49.                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功  
  50.             }  
  51.         });  
  52.   
  53.         consumer.start();  
  54.   
  55.         System.out.println("Consumer Started.");  
  56.     }  
  57. }  






三、消费模式

广播消费:rocketMQ默认是集群消费,我们可以通过在Consumer来支持广播消费

consumer.setMessageModel(MessageModel.BROADCASTING);// 广播消费

[java]  view plain  copy
  1. package model;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;  
  6. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;  
  7. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;  
  8. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;  
  9. import com.alibaba.rocketmq.client.exception.MQClientException;  
  10. import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;  
  11. import com.alibaba.rocketmq.common.message.MessageExt;  
  12. import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel;  
  13.   
  14. /** 
  15.  * Consumer,订阅消息 
  16.  */  
  17. public class Consumer2 {  
  18.   
  19.     public static void main(String[] args) throws InterruptedException, MQClientException {  
  20.         DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");  
  21.         consumer.setNamesrvAddr("192.168.100.145:9876;192.168.100.146:9876");  
  22.         consumer.setConsumeMessageBatchMaxSize(10);  
  23.         consumer.setMessageModel(MessageModel.BROADCASTING);// 广播消费  
  24.       
  25.         consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);  
  26.   
  27.         consumer.subscribe("TopicTest", "*");  
  28.   
  29.         consumer.registerMessageListener(new MessageListenerConcurrently() {  
  30.   
  31.             public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {  
  32.   
  33.                 try {  
  34.   
  35.                     for (MessageExt msg : msgs) {  
  36.                         System.out.println(" Receive New Messages: " + msg);  
  37.                     }  
  38.   
  39.                 } catch (Exception e) {  
  40.                     e.printStackTrace();  
  41.                     return ConsumeConcurrentlyStatus.RECONSUME_LATER;// 重试  
  42.                 }  
  43.   
  44.                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功  
  45.             }  
  46.         });  
  47.   
  48.         consumer.start();  
  49.   
  50.         System.out.println("Consumer Started.");  
  51.     }  
  52. }  

如果我们有2台节点,Producerw往MQ上写入20条数据 其中Consumer1中拉取了12条 。Consumer2中拉取了8 条,这种情况下,加入Consumer1宕机,那么我们消费数据的时候,只能消费到Consumer2中的8条,Consumer1中的12条已经持久化到中。需要Consumer1回复之后这12条数据才能继续被消费。其实这种先启动producer往MQ上写数据,然后再启动Consumer的情况本来就是违规操作,正确的情况应该是先启动Consumer后再启动producer。



异步复制和同步双写主要是主和从的关系。消息需要实时消费的,就需要采用主从模式部署

异步复制:比如这里有一主一从,我们发送一条消息到主节点之后,这样消息就算从producer端发送成功了,然后通过异步复制的方法将数据复制到从节点

同步双写:比如这里有一主一从,我们发送一条消息到主节点之后,这样消息就并不算从producer端发送成功了,需要通过同步双写的方法将数据同步到从节点后, 才算数据发送成功。


四、刷盘方式

同步刷盘:在消息到达MQ后,RocketMQ需要将数据持久化,同步刷盘是指数据到达内存之后,必须刷到commitlog日志之后才算成功,然后返回producer数据已经发送成功。


异步刷盘:,同步刷盘是指数据到达内存之后,返回producer说数据已经发送成功。,然后再写入commitlog日志。


commitlog:

commitlog就是来存储所有的元信息,包含消息体,类似于Mysql、Oracle的redolog,所以主要有CommitLog在,Consume Queue即使数据丢失,仍然可以恢复出来。

consumequeue:记录数据的位置,以便Consume快速通过consumequeue找到commitlog中的数据


RocketMQ 第六章:手把手教老婆实现-批量消息生产者和消费者 / 5.发送消息// 发送状态System.out.println(“发送结果:” + result);// 线程睡1秒// 6.关闭生产者producerSystem.out.println(“生产者关闭”);效果:第四节:批量消息消费者//1.创建消费者Consumer,制定消费者组名//2.指定Nameserver地址//消息拉取最大条数//3.订阅主题Topic和Tag//4.设置回调函数,处理消息//接受消息内容@Overridetry { 阅读详情

相关推荐

RocketMQ-核心篇(2)-核心概念

文章目录一、消息模型(Message Model)二、消息生产者(Producer)三、消息消费者(Consumer)四、主题(Topic)五、代理服务器(Broker Server)六、名字服务(Name Server)七、拉取式消费(Pull Consumer)八、推动式消费(Push Consumer)九、生产者组(Producer Group)十、消费者组(Consumer Group)十一、集群消费(Clustering)十二、广播消费(Broadcasting)十三、普通顺序消息(Normal

TianXinCoord的博客 1万+

Rocketmq消息批量发送&消息批量消费

Pull是客户端需要主动到服务端取数据,优点是客户端可以依据自己的消费能力进行消费,但拉取的频率也需要用户自己控制,拉取频繁容易造成服务端和客户端的压力,拉取间隔长又容易造成消费不及时。批量消费消息是一种提高 RocketMQ 消费者性能和吞吐量的好方法,但需要注意消息列表大小、消息顺序和事务性质等问题,以确保消费者的可靠性和稳定性。前言:批量发送和消费消息在一定程度上可以提高吞吐量,减少带宽,那么Rocketmq 中的消息怎么进行批量的发送和批量的消费呢;计算消息的大小并进行压缩。

拽着尾巴的鱼儿的博客 1万+

RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费

RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费

扶摇而上九万里 6697

Rocketmq批量消费

【代码】Rocketmq批量消费。

dj1955的博客 780

RocketMQ系列之消息重试+重复消费

前言 上节我们介绍了RMQ的几大模块以及每个模块的作用,前面也介绍了RMQ的订阅消费案例,今天我们来看一个RMQ的消息重试机制和重复消费的问题,了解这2点有助于我们更好更合理的处理消息消费的异常情况。 为什么会出现消息重试? 因为RMQ的消息都是通过网络传输的,通过网络传输就难免会受网络环境的影响,各种可能存在的情况,可能导致生产者Producer发送消息失败,也可能导致消费者Consumer消费消息失败,因此RMQ的消息重试机制就显得比较重要了,这也是RMQ的一大优势所在,显然消息重试机..

吭哧吭哧快乐的小牛码 2万+

【RocketMQ】消息重试、重试次数设置、死信队列

文章目录1. 死信队列1.1 死信特性1.2 查看死信消息参考 1. 死信队列 上一篇《RocketMQ:消息重试》中我们提到当一条消息消费失败时,RocketMQ会进行一定次数的重试。重试的结果也很简单,无非就是在第N次重试时,被成功消费。或者就是经过M次重试后,仍然没有被消息。这通常是由于消费者在正常情况下无法正确地消费该消息。此时,RocketMQ不会立即将消息丢弃,而是将其发送到该消费者对应的特殊队列中去。 在RocketMQ中,这种正常情况下无法被消费的消息被称为死信消息(Dead-Lette

m0_45406092的博客 2万+

Redis中Rocket重试机制

字符串是其他四种类型的基础,与其他几种类型的区别从本质上来说只是组织字符串的方式不同而已。中最基本的数据类型,它能够存储任何类型的字符串,包含二进制数据。端发送成功了,需要通过同步双写的方法将数据同步到从节点后, 才算数据发。比如这里有一主一从,我们发送一条消息到主节点之后,这样消息就并不算从。条数据才能继续被消费,如果想保证消息实时消费,就才用双。如果非第一次启动,那么按照上次消费的位置继续消费。如果非第一次启动,那么按照上次消费的位置继续消费。如果非第一次启动,那么按照上次消费的位置继续消费。

2301_78102191的博客 329

RocketMQ保证消息不丢失的手段

消息整体处理过程 这里我们将消息的整体处理阶段分为3个阶段进行分析: Producer发送消息阶段。 Broker处理消息阶段。 Consumer消费消息阶段。 Producer发送消息阶段 发送消息阶段涉及到Producer到broker的网络通信,因此丢失消息的几率一定会有,那RocketMQ在此阶段用了哪些手段保证消息不丢失了(或者说降低丢失的可能性)。 手段一:提供SYNC的发送消息方式,等待broker处理结果。 RocketMQ提供了3种发送消息方式,分别是: //同步

Silence的博客 2533

java什么是消息刷盘_Rocket重试机制,消息模式,刷盘方式

一、Consumer批量消费(推模式)可以通过consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条这里需要分为2种情况Consumer端先启动Consumer端后启动. 正常情况下:应该是Consumer需要先启动注意:如果broker采用推模式的话,consumer先启动,会一条一条消息的消费,consumer后启动会才用批量消费Cons...

weixin_36307549的博客 351

基于PID的定速巡航控制系统设计【MATLAB源码+Word文档】

本文详细介绍了定速巡航控制是一种车辆驾驶辅助系统,它能让驾驶者在高速或长途驾驶时,设定一个固定的车速,然后车辆会自动维持这个速度行驶,无需驾驶者持续踩油门。这大大减轻了驾驶者的疲劳,同时也提高了行驶的安全性。PID定速巡航控制系统是一种利用比例(Proportional)、积分(Integral)和微分(Derivative)控制算法来实现车辆定速巡航的先进系统。这种系统能够根据设定的速度,自动调整油门开度或制动力度,使车辆保持恒定的速度行驶。这种控制系统具有响应速度快、控制精度高、稳定性好等优点。

weixin_761237174的博客 1669

Unity游戏开发:从零开始适配Nintendo Switch的完整指南

本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。

vodka的博客 1068

rocketmq 消费方式_rocketmq:当同一消费组的消费方式被修改后,消费组将按什么方式消费。-问答-阿里云开发者社区-阿里云...

一、Consumer 批量消费可以通过[java] view plain copyconsumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条这里需要分为2种情况1、Consumer端先启动 2、Consumer端后启动. 正常情况下:应该是Consumer需要先启动1、Consumer端先启动Consumer代码如下[java] view pla...

weixin_39586683的博客 275

方差迭代计算公式

方差迭代计算过程推导术语约定递推公式过程推导 术语约定 (1)En=1n∑i=1nxi E_n =\frac{1}{n} \sum_{i=1}^{n}x_i \tag{1} En​=n1​i=1∑n​xi​(1) (2)F(n)=∑i=1n(x2−En) F(n) = \sum_{i=1}^{n}{(x^2-E_n)} \tag{2} F(n)=i=1∑n​(x2−En​)(2) (3)V(n)...

weixin_44479136的博客 7921

Rocket重试机制,消息模式,刷盘方式

一、Consumer批量消费(推模式) 可以通过 consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条 这里需要分为2种情况 Consumer端先启动 Consumer端后启动. 正常情况下:应该是Consumer需要先启动 注意:如果broker采用推模式的话,consumer先启动,会一条...

weixin_34163553的博客 117

深入解析达梦数据库核心技术:检查点、redo、undo、MVCC与内存缓存刷盘

MVCC 依赖 undo 日志:通过 undo 日志构建版本链,实现 “读不加锁”;刷盘依赖检查点:检查点批量清理脏页,redo 日志通过检查点释放空间;日志保障刷盘安全:redo 日志先行写入,确保未刷盘脏页可恢复;刷盘优化 MVCC 性能:优先刷冷区脏页,减少对高频访问数据的影响。例如,一个完整的 “查询 - 修改 - 提交 - 恢复” 流程中:查询时,MVCC 通过 undo 日志获取可见版本,无需等待锁;修改时,redo/undo 日志先记录,缓冲池生成脏页;

tangyuan12345678的博客 1415

【Zephyr存储专题】06_存储块设备驱动开发(Nand Flash)

本文介绍了基于Zephyr系统的NAND Flash驱动实现方案,重点阐述了Flash驱动模型的核心架构和关键API设计。

zero的博客 1803

Rocketmq如何保证消息不丢失,如何保证消息不被重复消费

1、消息整体处理过程 这里我们将消息的整体处理阶段分为3个阶段进行分析: Producer发送消息阶段。 Broker处理消息阶段。 Consumer消费消息阶段。 Producer发送消息阶段 发送消息阶段涉及到Producer到broker的网络通信,因此丢失消息的几率一定会有,那RocketMQ在此阶段用了哪些手段保证消息不丢失了(或者说降低丢失的可能性)。 手段一:提供SYNC的发送消息方式,等待broker处理结果。 RocketMQ提供了3种发送消息方式,分别是: 同步发送

meser88的博客 1万+

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1478

这些年遇到的RocketMQ消息消费超时/消费异常重试机制导致的重复消费问题(并发消费和顺序消费)源码分析

图文详述并发消费模式和顺序消费下RocketMQ消息消费超时、消息消费出现异常时的重试机制原理、源码

健身变秃,coding变强 1万+

7、复杂分布式水文模型的两阶段代理参数校准框架

本文提出了一种针对复杂分布式水文模型的两阶段代理参数校准框架,旨在解决可变入渗能力模型(VIC)在参数校准过程中计算成本高、耗时长的问题。该框架结合AdaBoost与反向传播神经网络(BPNN)构建高精度代理模型,并引入ε-NSGA II多目标优化算法加速搜索最优参数集。通过在兰江流域和湘江流域的实验验证,该方法在校准效率上提升了约20倍,同时保持了高模拟精度(NSE接近1,Bias接近0)。框架采用两阶段设计:第一阶段(SM-I)快速筛选关键参数范围,第二阶段(SM-II)进行高精度预测,显著减少了无效计

apple5的专栏 86

Vue - 解决 Property or method “__v_isRef“ is not defined on the instance but referenced(浏览器控制台报错,代码没错)

vue,vue2控制台报错,vue报错Propertyormethod"__v_isRef"isnotdefinedontheinstancebutreferenced,vue代码没问题,但是报错Propertyormethod"__v_isRef"isnotdefinedontheinstancebutreferenced,vue2如何解决报错,vue怎么解决报错问题,vue2Propertyormethod"__v_isRef"isnotdefi

🏆 前端领域优质创作者 4501
上一篇: ActiveMQ 数据持久化
下一篇: Linux Xshell中文编码设置
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值