当前位置: 首页 > news >正文

一站式织梦网站模板企业门户网站开发费用

一站式织梦网站模板,企业门户网站开发费用,动漫网站源码下载,免费行情软件appJava后端中的延迟队列实现#xff1a;使用Redis与RabbitMQ的不同策略 大家好#xff0c;我是微赚淘客返利系统3.0的小编#xff0c;是个冬天不穿秋裤#xff0c;天冷也要风度的程序猿#xff01; 在后端开发中#xff0c;延迟队列#xff08;Delayed Queue#xff09…Java后端中的延迟队列实现使用Redis与RabbitMQ的不同策略 大家好我是微赚淘客返利系统3.0的小编是个冬天不穿秋裤天冷也要风度的程序猿 在后端开发中延迟队列Delayed Queue是一种非常实用的设计能够帮助我们在指定时间后处理某些任务。无论是订单超时处理、定时消息通知还是需要延迟执行的任务延迟队列都能为我们提供高效的解决方案。常见的实现延迟队列的策略有很多其中Redis和RabbitMQ是两种流行的方案。本文将从这两种策略的角度探讨如何在Java后端中实现延迟队列。 一、什么是延迟队列 延迟队列的基本原理是在消息被放入队列后不会立即被消费而是需要等到指定的时间后消费者才能消费这些消息。延迟队列的典型应用场景包括 延迟发送消息如邮件或通知定时任务执行如定期清理、自动过期超时订单的处理 下面我们将分别介绍如何利用Redis和RabbitMQ实现延迟队列并提供对应的Java代码示例。 二、基于Redis的延迟队列实现 Redis可以通过其Sorted Set有序集合和TTL机制来实现延迟队列。有序集合中的每个元素都有一个关联的分数分数用于排序。我们可以将消息存入有序集合并将当前时间戳加上延迟时间作为分数这样我们就可以使用ZRANGEBYSCORE命令获取到期的消息。 Redis延迟队列的Java实现 package cn.juwatech.redis;import redis.clients.jedis.Jedis;import java.util.Set;public class RedisDelayQueue {private static final String DELAY_QUEUE_KEY delay_queue;private Jedis jedis;public RedisDelayQueue() {this.jedis new Jedis(localhost, 6379);}// 添加任务到延迟队列public void addTask(String taskId, long delay) {long score System.currentTimeMillis() delay;jedis.zadd(DELAY_QUEUE_KEY, score, taskId);}// 轮询获取到期的任务public void pollTasks() {while (true) {long currentTime System.currentTimeMillis();// 获取延迟时间已到的任务SetString tasks jedis.zrangeByScore(DELAY_QUEUE_KEY, 0, currentTime);for (String task : tasks) {// 处理任务System.out.println(处理任务: task);// 移除已处理任务jedis.zrem(DELAY_QUEUE_KEY, task);}try {Thread.sleep(1000); // 每秒轮询一次} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}public static void main(String[] args) {RedisDelayQueue delayQueue new RedisDelayQueue();delayQueue.addTask(task1, 5000); // 延迟5秒delayQueue.addTask(task2, 10000); // 延迟10秒// 启动轮询线程处理任务new Thread(delayQueue::pollTasks).start();} }代码解析 我们使用Redis的有序集合来存储任务每个任务有一个时间戳作为分数。addTask方法将任务ID与延迟后的时间戳一同存入Redis。pollTasks方法定期从Redis中查询当前时间已到期的任务并处理。 Redis的延迟队列方案具有简单、轻量的优势但由于需要轮询来检测任务是否到期因此在高并发场景下可能存在性能瓶颈。 三、基于RabbitMQ的延迟队列实现 RabbitMQ提供了更专业的消息队列功能并且可以通过插件的方式直接支持延迟队列。使用RabbitMQ的延迟队列有两种常见方式一是基于TTLTime-To-Live和DLXDead Letter Exchange二是使用RabbitMQ的延迟消息插件。 RabbitMQ延迟队列的Java实现 package cn.juwatech.rabbitmq;import com.rabbitmq.client.*;import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException;public class RabbitMQDelayQueue {private static final String EXCHANGE_NAME delay_exchange;private static final String QUEUE_NAME delay_queue;private static final String DEAD_LETTER_EXCHANGE dead_letter_exchange;private Connection connection;private Channel channel;public RabbitMQDelayQueue() throws IOException, TimeoutException {ConnectionFactory factory new ConnectionFactory();factory.setHost(localhost);this.connection factory.newConnection();this.channel connection.createChannel();// 声明死信交换机和队列MapString, Object args new HashMap();args.put(x-dead-letter-exchange, DEAD_LETTER_EXCHANGE);// 声明延迟队列指定TTLchannel.queueDeclare(QUEUE_NAME, true, false, false, args);channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);// 绑定队列到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, delay);}// 发送延迟消息public void sendDelayedMessage(String message, long delay) throws IOException {MapString, Object headers new HashMap();headers.put(x-delay, delay);AMQP.BasicProperties properties new AMQP.BasicProperties.Builder().headers(headers).expiration(String.valueOf(delay)) // TTL.build();channel.basicPublish(EXCHANGE_NAME, delay, properties, message.getBytes());System.out.println(发送延迟消息: message 延迟: delay 毫秒);}// 消费消息public void consumeMessage() throws IOException {channel.basicConsume(QUEUE_NAME, true, (consumerTag, message) - {String body new String(message.getBody());System.out.println(接收到消息: body);}, consumerTag - {});}public static void main(String[] args) throws IOException, TimeoutException {RabbitMQDelayQueue delayQueue new RabbitMQDelayQueue();delayQueue.sendDelayedMessage(task1, 5000); // 延迟5秒delayQueue.sendDelayedMessage(task2, 10000); // 延迟10秒// 启动消费端delayQueue.consumeMessage();} }代码解析 交换机和队列声明我们声明了一个死信交换机用于接收延迟消息。发送延迟消息在发送消息时我们设置了TTL消息存活时间消息会在指定时间后转发到死信交换机并最终到达目标队列。消费消息消费者会从延迟队列中接收到消息并进行处理。 RabbitMQ的延迟队列方案更加专业适用于高并发、分布式环境下的消息延迟处理。而且通过使用RabbitMQ的原生插件我们可以轻松管理延迟消息的精度和性能。 四、Redis与RabbitMQ延迟队列的对比 特性RedisRabbitMQ实现复杂度简单通过Sorted Set实现较复杂需要配置TTL和DLX机制性能适合中小型任务性能取决于轮询效率高并发场景表现优异专业队列系统延迟精度受轮询间隔影响延迟精度高TTL直接控制可扩展性难以扩展需依赖分布式锁等机制天然支持分布式、消息队列可靠性数据持久化机制简单提供强大的消息持久化与确认机制 五、应用场景分析 Redis延迟队列更适合任务量不大、处理相对简单的场景例如订单超时提醒、限时优惠处理等。RabbitMQ延迟队列适合需要处理高并发、大规模任务调度的场景如电商订单、支付系统中的延时扣款和分布式任务调度等。 结语 在Java后端开发中延迟队列是实现定时任务和延迟消息处理的有效手段。通过Redis和RabbitMQ这两种不同的技术栈我们可以灵活选择适合自己业务场景的延迟队列方案。Redis简单易用适合小型任务Rabbit MQ功能强大能够处理复杂的分布式延迟任务。通过合理的选择和配置我们可以提升系统的性能与可扩展性。 本文著作权归聚娃科技微赚淘客系统开发者团队转载请注明出处
http://www.hkea.cn/news/14566741/

相关文章:

  • 龙岩网站排名电商好做吗?
  • 化州市建设局网站建设网站步骤是
  • app开发去哪个网站免费网址申请
  • 汉南网站建设做家乡网站代码
  • 门户网站首页模板下载怎么做一个手机网站
  • 衡水企业做网站推广asp.net 3.5网站开发全程解析
  • 黑色门户网站源码网站开发 加二维扫码
  • 建网站找那家企业好做一个招聘网站需要多少钱
  • 中国建设银行网站企业网银国家建设官方网站
  • 企业进行网站建设的方式有哪些天津做公司的网站
  • 做疏通什么网站推广好重庆专业网站推广平台
  • 广西上林建设局网站网站收缩引擎入口
  • 山西省建设厅网站打不开咖啡网页设计素材
  • 湘潭网站制作建设网站建设跟推广评价指标有什么关系
  • 网站建设公司岗位关键词大全
  • 网站添加cms个人博客怎么做
  • 空壳网站清理天津公司网站建设费
  • 汉口网站制作广东深圳有几个区
  • 做网站编辑是不是也要做推广网站会员注册系统源码
  • 天津网站建设 易尔通怎么进行网站诊断
  • 马可波罗网站如何做产品推广阿里巴巴网站域名注册
  • 医疗网站报价方案网站后台管理系统怎么进
  • wordpress 网站改名公司网站搭建
  • 长沙河西做网站群晖wordpress打开慢
  • 自助分红网站建设好看的seo网站
  • 做的网站没流量网站浏览器兼容性问题
  • 外贸建站公司排名wordpress 海报风格
  • 网站开发课设国际品牌的广州网页设计
  • 网站多语言界面建设方案wordpress密文
  • 北京网站建设优化成都代理注册公司电话