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

RabbitMQ 不公平分发介绍

        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 连接工厂和消息监听器容器:

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");  
    }  
}
消息接收者

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

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();  
        }  
    }  
}
发送消息

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

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.kler.cn/a/385300.html

相关文章:

  • 2-148 基于matlab的铣削动力学仿真
  • 【Linux系统】—— 基本指令(二)
  • 【网络】网络层协议IP
  • 在vscode中开发运行uni-app项目
  • 基于 Transformer 的语言模型
  • vue2与vue3的全局通信插件,如何实现自定义的插件
  • VUE单页面 路由
  • Netty篇(入门编程)
  • 麒麟信安支撑2024年电力监控系统网络安全加固培训护航电力网络安全!
  • vscode----ssh远程连接输入地址跳转扩展
  • SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
  • Navicat15,Navicat16闪退,创建连接,使用自带工具等闪退
  • 二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
  • 【ChatGPT】让ChatGPT帮助制定项目计划与任务分配
  • App投放增长:RTA
  • 【笔记】扩散模型(九):Imagen 理论与实现
  • 什么是ReasonML,有什么特点
  • 利用SheetJS在前端解析Excel读取数据并赋值给组件
  • Sentinel通过限流对微服务进行保护
  • 免费caj转pdf
  • 上门理发系统的搭建
  • Flutter鸿蒙next 状态管理框架对比分析
  • I.MX6U 裸机开发3. GPIO操作控制LED灯
  • leetcode哈希表(四)-快乐数
  • glide 加载gif 卡顿内存高问题 优化
  • [java][框架]springMVC(1/2)