RabbitMQ的三种Exchange,数据持久化,非持久化实例

RabbitMQ三种Exchange数据持久化实例
本文介绍了RabbitMQ中的三种主要Exchange类型——direct、fanout和topic,并通过实例展示了数据持久化和非持久化的使用。在进行开发时,建议使用3.4.0以下版本的RabbitMQ包,以避免可能出现的超时问题。内容涵盖了生产者的实现细节,是初学者的学习参考资料。

由于最近项目需要用到Rabbitmq的数据持久化技术,利用空闲时间,分别对Rabbitmq的三种常用的Exchange(direct、fanout、topic)写了个测试实例,仅供初学者参考学习,还望各路大神勿吐槽。

开发之前需要引用包:最好是3.4.0以下版本,因为以上版本试过,出现超时,具体原因尚未研究,还望研究过的大神留言告知一下,谢谢。


		<dependency>
			<groupId>com.rabbitmq</groupId>
			<artifactId>amqp-client</artifactId>
			<version>3.4.0</version>
		</dependency>

1.direct(发布与订阅)

1.1生产者(Direct)

public class Direct {
	private static final String EXCHANGE_NAME = "temp_direct";  
    private static final String[] TYPE = { "info", "warning", "error" };  
    
    public static void main(String[] argv) throws java.io.IOException  
    {  
        // 创建连接和频道  
        ConnectionFactory factory = new ConnectionFactory();  
        factory.setHost("192.168.32.129");  
        Connection connection = factory.newConnection();  
        Channel channel = connection.createChannel();  
        // 声明转发器的类型  
        channel.exchangeDeclare(EXCHANGE_NAME, "direct",true);  
  
        //发送6条消息  
        for (int i = 0; i <TYPE.length; i++)  
        {  
            String rand = getRandom();  
            String message = rand + "_log :" + UUID.randomUUID().toString();  
            //持久化
            channel.queueDeclare(TYPE[i], true, false, false, null);
            //流量
            channel.basicQos(1);
            //将消息队列绑定到Exchange
            channel.queueBind(TYPE[i], EXCHANGE_NAME, TYPE[i]);
            // 发布消息至转发器,指定routingkey  
            channel.basicPublish(EXCHANGE_NAME, TYPE[i], null, message  
                    .getBytes());  
            System.out.println("队列" + TYPE[i] + "绑定成功!");  
        }  
  
        channel.close();  
        connection.close();  
    }  
  
    /** 
     * 随机产生一种日志类型 
     *  
     * @return 
     */  
    private static String getRandom() 
### RabbitMQ 持久化相关面试题及解决方案 #### 1. 如何保证消息丢失? 为了防止消息在传输过程中丢失,RabbitMQ 提供了多种机制来保障消息的安全性和可靠性。以下是主要的措施: - **Confirm 消息确认机制 (生产者)** 生产者发送消息到 RabbitMQ 后,可以通过开启 Confirm 模式来确保消息成功到达服务器。如果消息未能投递给目标队列,则会触发回调函数通知生产者重试或采取其他补救措施[^2]。 - **消息持久化机制 (RabbitMQ 服务)** 配置消息为持久化状态可以使其存储在磁盘上而是仅存在于内存中。即使 RabbitMQ 宕机重启后,这些消息仍然能够恢复并继续传递给消费者[^1]。 - **ACK 事务机制 (消费者)** 当消费者接收到一条消息时,在完成对该条数据的所有处理之后才向 Broker 发送 ACK 确认信号表示已接收完毕;如果没有返回 ACK 或者发生异常断开连接等情况,则该未被确认的消息会被重新放回原队列等待再次分配给新的客户端实例去消费它。 #### 2. 哪些组件支持持久化RabbitMQ持久化功能仅限于消息本身,还包括以下几个方面: - **交换器(Exchange)** 和 **队列(Queue)** 可以设置成 durable 属性以便它们能够在 broker 节点崩溃后再次启动起来的时候依然存在而消失掉。 示例代码如下所示: ```python channel.exchange_declare(exchange='my_durable_exchange', exchange_type='direct', durable=True) channel.queue_declare(queue='my_durable_queue', durable=True) ``` - **绑定关系(Binding)** 需要单独声明其是否具备耐用特性,默认情况下当关联双方均为持久实体时此链接也会保持变直至显式解除为止。 #### 3. 如果遇到大量积压待处理的数据怎么办? 针对可能出现的大规模未读记录现象可以从多个角度出发寻找对策: - **提高并发能力** - 添加更多工作线程或者进程参与到任务执行当中从而加快整体进度; - 对现有程序内部结构加以改进使得每次循环迭代所耗费时间更少一些比如通过批量提交请求等方式减少频繁交互带来的额外负担[^4]。 - **启用 prefetch count 参数限制每台机器最多允许获取多少尚未反馈成功的项目数以此平衡负载压力避免某些节点因过度占用资源而陷入瘫痪状态无法正常运作下去^. - **引入优先级概念让重要程度较高的指令先得到响应机会进而缓解紧急状况下的延迟问题同时兼顾公平原则给予低权重对象合理安排轮候顺序的机会.** --- ### 总结 综上所述,通过对 RabbitMQ 进行适当调整以及采用科学合理的运维手段完全可以有效应对各种复杂场景下产生的挑战达到预期效果即最大程度降低丢包率的同时还能维持高效稳定运行环境满足实际需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值