RabbitMQ 不公平分发介绍

devtools/2024/11/6 14:23:49/

        RabbitMQ 是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。在 RabbitMQ 中,消息分发策略对于系统的性能和负载均衡至关重要。默认情况下,RabbitMQ 使用公平分发(Fair Dispatch)策略,以确保所有消费者都能平等地处理消息。然而,在某些情况下,我们可能希望使用不公平分发(Unfair Dispatch)策略,以允许某些消费者处理更多的消息,从而实现特定的性能优化或负载均衡需求。

公平分发 vs 不公平分发
  • 公平分发:RabbitMQ 会确保每个消费者按照其处理速度来公平地接收消息。如果一个消费者正在处理消息,那么它不会接收到新的消息,直到它完成当前消息的处理。这种策略有助于避免某些消费者过载,而其他消费者空闲的情况。

  • 不公平分发:在这种模式下,RabbitMQ 不会对消费者进行限制,允许一个消费者在处理消息的同时继续接收新的消息。这可能会导致某些消费者处理更多的消息,而其他消费者处理较少的消息。不公平分发在某些场景下可以提高吞吐量,但也可能导致负载不均衡。

使用不公平分发的场景
  • 性能优化:当某些消费者处理消息的速度远快于其他消费者时,不公平分发可以允许这些消费者处理更多的消息,从而提高整体吞吐量。
  • 特定负载需求:在某些应用场景中,可能希望某些消费者处理更多的任务,以实现特定的业务逻辑或性能目标。

Java 代码示例

        下面是一个使用 Spring AMQP 和 RabbitMQ 的 Java 示例,展示了如何配置和使用不公平分发策略。

依赖配置

        首先,在你的 pom.xml 文件中添加 Spring AMQP 和 RabbitMQ 的依赖:

<dependencies>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-amqp</artifactId>  </dependency>  <dependency>  <groupId>com.rabbitmq</groupId>  <artifactId>amqp-client</artifactId>  </dependency>  
</dependencies>
配置 RabbitMQ 和不公平分发

        创建一个配置类来配置 RabbitMQ 连接工厂和消息监听器容器:

java">import org.springframework.amqp.core.Queue;  
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;  
import org.springframework.amqp.rabbit.connection.ConnectionFactory;  
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;  
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class RabbitMQConfig {  public static final String QUEUE_NAME = "unfair_queue";  @Bean  public Queue queue() {  return new Queue(QUEUE_NAME, true);  }  @Bean  public ConnectionFactory connectionFactory() {  CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");  return connectionFactory;  }  @Bean  public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory,  MessageListenerAdapter listenerAdapter) {  SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();  container.setConnectionFactory(connectionFactory);  container.setQueueNames(QUEUE_NAME);  container.setMessageListener(listenerAdapter);  container.setPrefetchCount(1); // 设置为1以确保消息是逐个分发的  container.setBasicQosParameters(1, false); // 第二个参数false表示不公平分发  return container;  }  @Bean  public MessageListenerAdapter listenerAdapter(Receiver receiver) {  return new MessageListenerAdapter(receiver, "receiveMessage");  }  
}
消息接收者

        创建一个消息接收者类来处理消息:

java">import org.springframework.stereotype.Component;  @Component  
public class Receiver {  public void receiveMessage(String message) {  System.out.println("Received <" + message + ">");  try {  // 模拟消息处理时间  Thread.sleep((int) (Math.random() * 1000));  } catch (InterruptedException e) {  Thread.currentThread().interrupt();  }  }  
}
发送消息

        创建一个简单的控制器来发送消息到队列中:

java">import org.springframework.amqp.rabbit.core.RabbitTemplate;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;  @RestController  
public class MessageController {  @Autowired  private RabbitTemplate rabbitTemplate;  @GetMapping("/send")  public String sendMessage(@RequestParam String message) {  rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME, message);  return "Message sent: " + message;  }  
}

总结

        通过上述配置和代码示例,我们展示了如何在 Spring AMQP 和 RabbitMQ 中配置和使用不公平分发策略。不公平分发在某些特定场景下可以提高系统的性能,但也需要谨慎使用,以避免负载不均衡和某些消费者过载的问题。


新时代农民工


http://www.ppmy.cn/devtools/131779.html

相关文章

Ollama AI 框架缺陷可能导致 DoS、模型盗窃和中毒

近日&#xff0c;东方联盟网络安全研究人员披露了 Ollama 人工智能 (AI) 框架中的六个安全漏洞&#xff0c;恶意行为者可能会利用这些漏洞执行各种操作&#xff0c;包括拒绝服务、模型中毒和模型盗窃。 知名网络安全专家、东方联盟创始人郭盛华表示&#xff1a;“总的来说&…

PyTorch实战-手写数字识别-MLP模型

1 需求 包懂&#xff0c;40分钟掌握PyTorch深度学习框架&#xff0c;对应神经网络算法理论逐行讲解用PyTorch实现图像分类代码_哔哩哔哩_bilibili 10分钟入门神经网络 PyTorch 手写数字识别_哔哩哔哩_bilibili pytorch tutorial: PyTorch 手写数字识别 教程代码 从零设计并训…

数据结构的双向链表

1、头插法创建双向链表&#xff0c;节点是学生信息&#xff08;学号&#xff0c;分数&#xff0c;姓名&#xff09; 2、调用函数遍历链表所有信息 3、调用函数&#xff0c;求出分数是完数的学生&#xff0c;并输出该学生所有信息 4、调用函数&#xff0c;按照姓名查找某个学…

富格林:揭露欺诈陷阱用心追损

富格林指出&#xff0c;现货黄金投资作为一种比较受青睐的投资方式&#xff0c;已经赢得了很多投资理财者的关注了。但是投资现货黄金需要对黄金相关的交易操作和技巧有深入的了解&#xff0c;才能够规避欺诈陷阱用心追损。事实上&#xff0c;掌握一定的交易技巧对于规避欺诈陷…

unity3d————线性插值知识点

一、线性插值的基本概念 线性插值是指在两个已知点之间&#xff0c;按照某种线性关系插入一个新的点的过程。在Unity3D中&#xff0c;线性插值通常用于在两个数值、向量、颜色等之间平滑过渡。 二、Unity3D中的线性插值函数 Unity3D提供了多个线性插值函数&#xff0c;以满足…

第三十三章:docker 启动mysql web管理工具- MyWebSQL

mysql web管理工具- MyWebSQL 目标 掌握docker 安装 mywebsqlMyWebSQL介绍 MyWebSQL 是一个基于 Web 的数据库管理工具,它允许用户通过浏览器管理 MySQL 数据库。与 Navicat 这样的桌面 SQL 客户端工具相比,MyWebSQL 有一些明显的优势和劣势: 优势: 跨平台性:MyWebSQL 作…

气膜网球馆:城市文体生活的新标杆—轻空间

在城市的喧嚣中&#xff0c;气膜网球馆为广大运动爱好者提供了一个理想的锻炼空间。宽阔的标准网球场地铺设着专业的运动地胶&#xff0c;确保每一次击球都伴随着畅快的回响&#xff0c;让您在运动中尽情释放热情。 满足多样化的需求 气膜网球馆不仅适合日常锻炼&#xff0c;还…

信息安全技术

信息安全技术 网络安全漏洞分类分级指南 网络技术漏洞分级指标 代码问题&#xff1a;代码开发设计产生的漏洞 资源管理错误&#xff1a;系统资源&#xff08;内存、硬盘、cpu等&#xff09;的错误管理 输入验证错误&#xff1a;缺少数据的正确形式验证 缓存区…