RabbitMQ二之消息发布确认

本文探讨了RabbitMQ中单个确认、批量确认和异步确认的实现方式,通过实例展示它们在消息发送效率上的差异,异步确认耗时最少,单个确认耗时最长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

确认分为三种:单个确认、批量确认、异步确认

0.信道工具类

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class RabbitMqUtils {

    public static Channel getChannel() throws Exception {
        // 创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 工厂IP
        factory.setHost("192.168.112.220");
        // rabbitmq 用户名
        factory.setUsername("admin");
        // 密码
        factory.setPassword("123");

        // 创建一个连接
        Connection connection = factory.newConnection();
        // 获取信道
        Channel channel = connection.createChannel();

        return channel;
    }


}

1.单个确认

import com.rabbitmq.client.Channel;
import com.zym.rabbitmq.utils.RabbitMqUtils;

import java.util.UUID;

/**
 * 单个确认发布
 */
public class Confirm01 {
    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();
        String queueName = UUID.randomUUID().toString();
        channel.queueDeclare(queueName, true, false, false, null);
        //开启发布确认
        channel.confirmSelect();
        long startTime = System.currentTimeMillis();
        // 模拟发送一千条消息
        for (int i=0 ; i<1000; i++){
            String message = i+"";
            channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));
            // 消息发送完立即确认
            boolean flag = channel.waitForConfirms();
            if(flag){
                System.out.println("消息发送成功");
            }
        }

        long endTime = System.currentTimeMillis();
        System.out.println("单个确认所耗时间(毫秒)---->"+(endTime-startTime));
    }
}

结果

2.批量确认

import com.rabbitmq.client.Channel;
import com.zym.rabbitmq.utils.RabbitMqUtils;

import java.util.UUID;

/**
 * 批量确认发布
 */
public class Confirm02 {
    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();
        String queueName = UUID.randomUUID().toString();
        channel.queueDeclare(queueName, true, false, false, null);
        //开启发布确认
        channel.confirmSelect();
        // 批量确认消息大小  模拟100个消息确认一次
        int batchSize = 100;
        // 等待消息确认个数
        int waitingSize = 0;
        long startTime = System.currentTimeMillis();
        // 模拟发送一千条消息
        for (int i=1 ; i<1001; i++){
            String message = i+"";
            channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));
            waitingSize++;
            if(waitingSize == batchSize){
                //消息确认
                channel.waitForConfirms();
                waitingSize = 0;
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("批量确认所耗时间(毫秒)---->"+(endTime-startTime));
    }
}

 结果

3.异步确认

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmCallback;
import com.zym.rabbitmq.utils.RabbitMqUtils;

import java.util.UUID;

/**
 * 异步确认发布
 */
public class Confirm03 {
    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();
        String queueName = UUID.randomUUID().toString();
        channel.queueDeclare(queueName, true, false, false, null);
        //开启发布确认
        channel.confirmSelect();
        long startTime = System.currentTimeMillis();

        ConfirmCallback ackCallback = (sequenceNumber, multiple) -> {
            System.out.println("确认成功的消息序号:"+sequenceNumber);
        };

        ConfirmCallback nackCallback = (sequenceNumber, multiple) -> {
            System.out.println("确认失败的消息序号:"+sequenceNumber);
        };

        // 消息监听器,第一个参数:消息发送成功确认,第二个参数:消息发送失败确认
        channel.addConfirmListener(ackCallback,nackCallback);
        // 模拟发送一千条消息
        for (int i=1 ; i<1001; i++){
            String message = i+"";
            channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));

        }
        long endTime = System.currentTimeMillis();
        System.out.println("异步确认所耗时间(毫秒)---->"+(endTime-startTime));
    }
}

 结果:

总结:异步确认 60ms    批量确认 119ms  单个确认 632ms 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值