自己实现重试队列

Kafka | Kafka中如何实现死信队列&重试队列 当一条消息初次消费失败,消息队列 MQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 MQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。 与此对... 阅读详情

基于Disruptor的重试队列实现

import com.lmax.disruptor.*;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
import java.util.concurrent.Executors;

public class RetryQueueWithDisruptor {
    // 事件类
    static class RetryEvent {
        private Runnable task;
        private int retryCount;
        
        // getters and setters
    }

    // 事件工厂
    static class RetryEventFactory implements EventFactory<RetryEvent> {
        @Override
        public RetryEvent newInstance() {
            return new RetryEvent();
        }
    }

    // 事件处理器
    static class RetryEventHandler implements EventHandler<RetryEvent> {
        private final int maxRetries;
        
        public RetryEventHandler(int maxRetries) {
            this.maxRetries = maxRetries;
        }

        @Override
        public void onEvent(RetryEvent event, long sequence, boolean endOfBatch) {
            try {
                event.getTask().run();
            } catch (Exception e) {
                if (event.getRetryCount() < maxRetries) {
                    event.setRetryCount(event.getRetryCount() + 1);
                    // 计算退避时间
                    long delay = calculateBackoff(event.getRetryCount());
                    // 实际应用中应使用定时器重新发布事件
                    try {
                        Thread.sleep(delay);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                    }
                    // 重新发布事件进行重试
                    disruptor.publishEvent((retryEvent, seq) -> {
                        retryEvent.setTask(event.getTask());
                        retryEvent.setRetryCount(event.getRetryCount());
                    });
                } else {
                    // 达到最大重试次数,记录失败
                    System.err.println("任务重试失败: " + e.getMessage());
                }
            }
        }

        private long calculateBackoff(int retryCount) {
            return (long) Math.min(1000 * Math.pow(2, retryCount), 60000);
        }
    }

    private static Disruptor<RetryEvent> disruptor;

    public static void start(int bufferSize, int maxRetries) {
        RetryEventFactory factory = new RetryEventFactory();
        disruptor = new Disruptor<>(
            factory,
            bufferSize,
            Executors.defaultThreadFactory(),
            ProducerType.MULTI,
            new BlockingWaitStrategy()
        );
        
        disruptor.handleEventsWith(new RetryEventHandler(maxRetries));
        disruptor.start();
    }

    public static void submitTask(Runnable task) {
        disruptor.publishEvent((event, sequence) -> {
            event.setTask(task);
            event.setRetryCount(0);
        });
    }
}

基于LinkedBlockingQueue的重试队列实现

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class RetryQueueWithBlockingQueue {
    private final BlockingQueue<Runnable> queue;
    private final ExecutorService executor;
    private final int maxRetries;
    
    public RetryQueueWithBlockingQueue(int queueSize, int threadPoolSize, int maxRetries) {
        this.queue = new LinkedBlockingQueue<>(queueSize);
        this.executor = Executors.newFixedThreadPool(threadPoolSize);
        this.maxRetries = maxRetries;
        startConsumers();
    }
    
    private void startConsumers() {
        for (int i = 0; i < executor.getMaximumPoolSize(); i++) {
            executor.submit(() -> {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        Runnable task = queue.take();
                        executeWithRetry(task);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
            });
        }
    }
    
    public boolean submit(Runnable task) {
        return queue.offer(task);
    }
    
    private void executeWithRetry(Runnable task) {
        AtomicInteger retryCount = new AtomicInteger(0);
        while (retryCount.get() < maxRetries) {
            try {
                task.run();
                return;
            } catch (Exception e) {
                int count = retryCount.incrementAndGet();
                if (count >= maxRetries) {
                    System.err.println("任务重试失败: " + e.getMessage());
                    return;
                }
                long delay = calculateBackoff(count);
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                    return;
                }
            }
        }
    }
    
    private long calculateBackoff(int retryCount) {
        return (long) Math.min(1000 * Math.pow(2, retryCount), 60000);
    }
    
    public void shutdown() {
        executor.shutdownNow();
    }
}
用延迟任务队列实现 Harness 的定时重试 消除认知障碍:用小学生能听懂的语言,把“延迟任务队列”“定时重试”“幂等性”这些听起来很高大上的分布式系统术语,类比成生活中的日常小事(比如外卖小哥送外卖、图书馆借书预约、快递驿站存包裹),让完全没有接触过分布式系统的人也能理解它们的作用。构建可复用的系统:通过 Python + Celery + Redis 这个技术栈,一步步搭建一个功能完整、可配置、幂等性、可观测性。 阅读详情

相关推荐

PHP实现延时重试队列(附完整源码)

PHP实现延时重试队列(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 475

Java实现重试机制

关键词:线程、线程池、队列、任务调度 1、重试工具类 package com.iretry; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskS

春风化雨 3805

nvprof:CUDA编程性能分析工具

NVIDIA提供了具有高性能计算的GPU产品,如何检验硬件的实际性能,写出高效的CUDA代码让算力加速卡物尽其用,那可以通过其配套提供的“护城河”软件工具链来检验和帮助发挥GPU的性能:nvprof。如下,对于将8192个A,B向量进行向量加法运算,即C[i] = A[i] + B[i],当软件设置不同的blocknum, threadnum时候,CUDA执行kernel的时间是不同的。比如如下命令,可以看到程序tmp1的总体性能,下面一行是打印gpu的执行时间情况。

Briwisdom的博客 3384

Kafka 实现延迟队列、死信队列、重试队列

Kafka中实现延迟队列 在发送延时消息的时候并不是先投递到要发送的真实主题(real_topic)中,而是先投递到一些 Kafka 内部的主题(delay_topic)中,这些内部主题对用户不可见,然后通过一个自定义的服务拉取这些内部主题中的消息,并将满足条件的消息再投递到要发送的真实的主题中,消费者所订阅的还是真实的主题。 如果采用这种方案,那么一般是按照不同的延时等级来划分的,比如设定5s、10s、30s、1min、2min、5min、10min、20min、30min、45min、1hour、2

程序猿进阶 5802

CTransformers: 高效的Python语言模型绑定库

CTransformers是一个为C/C++实现的Transformer模型提供Python绑定的开源库。它基于GGML库构建,旨在为开发者提供一种高效且易用的方式来在Python中使用各种流行的语言模型。支持多种流行的语言模型,如GPT-2、LLaMA、Falcon等提供统一的简单API接口支持GPU加速(CUDA和Metal)与Hugging Face Transformers和LangChain集成支持流式输出和嵌入计算。

helloaiworld的博客 1267

手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

weixin_37584728的博客 2933

php rabbitmq 重试队列,RabbitMQ发布订阅实战-实现延时重试队列

RabbitMQ是一款使用Erlang开发的开源消息队列。本文假设读者对RabbitMQ是什么已经有了基本的了解,如果你还不知道它是什么以及可以用来做什么,建议先从官网的 RabbitMQ Tutorials 入门教程开始学习。本文将会讲解如何使用RabbitMQ实现延时重试和失败消息队列,实现可靠的消息消费,消费失败后,自动延时将消息重新投递,当达到一定的重试次数后,将消息投递到失败消息队列,等...

weixin_36139240的博客 533

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3637

RabbitMQ实现消息的消费确认,死信队列、延迟重试队列

消息的消费确认实现原理: 当消费者的消息消费异常时,消息进入延迟重试队列,待超时后重新发送到重试队列指定的死信队列,死信队列重新消费信息,如果又出现死信情况,继续进入延时重试队列,依次循环,当重试超过3次后,消息进入失败队列等待相应的消费者特殊处理或人工处理。 死信队列 死信队列*中(dead letter)死信的消息来源: 消息被拒绝(basic.reject或basic.nack)并且req...

白鸿源的博客 5178

【AI 编程工具】Codex配置部署指南

目录一、环境准备与基础安装1. 系统兼容性检查2. 前置依赖安装3. 安装方式选择二、API密钥配置与认证1. 获取API密钥2. 配置文件设置3. 临时配置方式三、沙盒环境配置与安全策略1. 沙盒模式选择2. 安全最佳实践四、高级功能配置1. 模型上下文协议(MCP)配置2. 模型版本切换3. 自定义网关配置五、常见问题排查1. 安装失败2. API调用失败3. 处理速度慢4. 配置文件不生效六、生产环境部署建议macOS/Linux:官方提供稳定支持,推荐使用原生环境Windows:官方标注为实验性支持

以实战经验介绍行业知识 2886

【精细解读】xapp585(多通道LVDS接口ADC)

xapp585的参考设计有Verilog和VHDL两种源码。

FPGA艺术家的博客 532

Java轻量延迟重试队列实现

很多开放平台都使用Webhook的方式进行外部系统数据同步或者通知,对于Webhook请求的对外发送不进行重试显然有点说不过去。使用简单的while一个条件去重试N次好像达不到什么效果,只能是说有重试而已,而使用消息队列中间件好像依赖又太重,于是索性自己动手写一个抽象范型延迟重试队列组件。

bossfriday - 个人博客 1352

[QMT量化交易小白入门]-三十四、让deepseek分析北京炒家的首板策略后,在打板前增加了选股范围(量化python代码解析)

print(f'开始盘前选股')这行代码定义了一个名为的函数,当调用这个函数时,会首先打印出“开始盘前选股”的信息,表明选股流程正式启动。1、可根据情况增删部分条件,目前盘前选股目前可以选出140多支,比之前全市场监听带宽压力小了很多。2、还可以自行添加其他选股条件,比如换手率计算,炸板可能性检测。3、xtdata的数据是有可能缺失的,自己写策略时,有可能需要剔除,或者从第三方库校正,比如部分股票的流通股数。

木头大左的博客 2695

基于springboot和rabbitMq实现延时重试队列

需求描述:日常开发常见的回调通知,如果回调失败,需要重试3次,每隔半小时重试一次,超过三次则放弃回调.

qq_24839631的博客 500

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2932

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【rabbitmq】使用延时队列+死信队列实现上篇的重试操作

首先来安装rabbitmq,我是在wsl上安装的,你可以根据自己的操作系统选择安装

吾生也有涯,而知也无涯 864

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RabbitMQ—SpringBoot中实现手动签收重试三次进入死信队列

RabbitMQ—SpringBoot中实现手动签收重试三次进入死信队列

shang_0122的博客 2689

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

laravel 任务队列_Laravel 消息队列的优先级和失败任务重试实现

上篇教程发布后,有同学反馈消息队列的优先级怎么实现,Laravel 本身对此提供了支持,除此之外,Laravel 的队列组件还支持批处理、延迟推送、失败任务处理、消息队列中间件、频率限制等很多特性,一篇教程根本介绍不完,毕竟消息队列也是个很复杂的系统,但是放到这里来讲似乎又偏离了 Redis 这个主题,所以这里学院君先给大家简单介绍下消息队列优先级和失败任务处理的实现,至于更多功能特性,...

weixin_42519170的博客 1724

4.2.8 Kafka 延时队列, 重试队列(结合redis实现)

4.2.8 Kafka 高级特性-延时/重试队列

chengh1993的博客 2587

RabbitMQ 发布订阅-实现延时重试队列(参考)

RabbitMQ消息处理失败,我们会让失败消息进入重试队列等待执行,因为在重试队列距离真正执行还需要定义的时间间隔,因此,我们可以将重试队列设置成延时处理。今天参考网上其他人的实现,简单梳理下消息延时重试执行的思路。 消费失败后,自动延时将消息重新投递,当达到一定的重试次数后,将消息投递到失败消息队列,等待人工介入处理。在这里我们一步一步实现一个带有失败重试功能的发布订阅组件,使用该组...

aini2749的博客 422

SpringBoot集成RabbitMQ实现消息重试机制,消息重试3次失败后写入死信队列,消息重试3次失败后入库

yml配置 spring: rabbitmq: username: admin password: admin host: localhost port: 5672 virtual-host: / publisher-confirm: true #发布确认 开启confirms回调 Producer -> Exchange publisher-returns: true #发布返回 开启returnedMessage回调 Exchange..

hsuan_优快云的博客 4333

基于Java延时队列实现,通用延时重试接口

仅需要实现一个接口,就能自定义重试逻辑与次数

weixin_57093836的博客 634

Spring Boot 实现 RabbitMQ 延迟消费和延迟重试队列

Spring Boot 实现 RabbitMQ 延迟消费和延迟重试队列 原文:Spring Boot 实现 RabbitMQ 延迟消费和延迟重试队列本文主要摘录自:详细介绍Spring Boot + RabbitMQ实现延迟队列 并增加了自己的一些理解,记录下来,以便日后查阅。 项目源码: spring-boot-rabbitmq-d...

weixin_30362083的博客 278

利用延时队列实现自动定时重试 - 基于PHP实现

测试步骤 搭建代码框架 创建测试项目的目录 mq 从 https://github.com/php-amqplib/php-amqplib 下载AMQP库(当然也可以通过 composer 安装,这里为了简单直接自己处理了),放入 mq 目录 编写 index.php,实现自动加载 创建 test 目录,编写生产者和消费者 跑脚本: 开启生产者:php -f index.php retryP p 开启消费者:php -f index.php retryC c 代码结构 ├─PhpAmqpLi

kikajack的博客 530

Android-怎样实现一个非阻塞的超时重试任务队列

起因 最近接手一个项目,要把其中的阻塞任务队列,重构成非阻塞。在客户端很少有机会直接处理任务队列。项目完成需要总结经验。 阻塞的发生 我这里先说明我遇到的阻塞问题,我这里的阻塞不是多线程访问的阻塞,概念上是任务执行的阻塞。具体是: 任务开始客户端准备数据,通过socket向服务器发送数据。 阻塞等待服务器socket的ack回应。 得到服务器的socket回应完成任务,取出队列的后续...

李可乐的专栏 2660
上一篇: 清分系统在电商中的一些案例
下一篇: 电商支付系统中使用flink进行风控管理案例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值