MQ消息的几种模式

MQ消息模式

入门

引入依赖

<dependencies>
        <!--引入跟rabbitmq交互的客户端jar包-->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>4.0.2</version>
        </dependency>
    </dependencies>

生产者

Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //3.声明队列
        //如果该队列不存在,则创建该队列,否则,不创建
        channel.queueDeclare(
                "simple-queue",false,false,false,null);
        //4.发送消息到队列上
        String message = "消息队列是一个非常重要的中间件";
        //我们没有指定交换机
        //实际是使用默认交换机
        channel.basicPublish("","simple-queue",null,message.getBytes());
          /* exchange – the exchange to publish the message to
             routingKey – the routing key
             props – other properties for the message - routing headers etc
             body – the message body*/

        System.out.println("发送消息成功!");
    }
}

在这里插入图片描述
第一个参数是交换机,没有就使用默认direct,转发给第二个参数队列;
在这里插入图片描述

消费者

1. 简单队列

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ea58d920d0634d07b3e0ededd726302a.png)
public class MyConsumer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("接收到的消息是:"+message);

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);//手工确认模式!
               //第一个参数:消息标记;第二个参数multiple.
               //long deliveryTag, boolean multiple
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume("simple-queue",false,consumer);
    }
}

在这里插入图片描述
autoAck是否自动确认模式

2、work模式

在这里插入图片描述

生产者

public class Producer {

    private static final String QUEUE_NAME = "work-queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //3.声明队列
        //如果该队列不存在,则创建该队列,否则,不创建
        channel.queueDeclare(
                QUEUE_NAME,false,false,false,null);
        //4.发送消息到队列上
        for (int i = 0; i < 10; i++) {
            String message = "这是第"+i+"遍说我爱你";
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        }

        System.out.println("发送消息成功!");
    }
}

消费者1

public class MyConsumer1 {

    private static final String QUEUE_NAME = "work-queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者1:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

消费者2

public class MyConsumer2 {

    private static final String QUEUE_NAME = "work-queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息
        channel.basicQos(1);

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者2:接收到的消息是:"+message);

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

问题:两个消费者如何抢10条消息?
共享的状态下,第一个消费者消费完后,第二个消费者就消费不到了。
默认情况下是均分的状态,你消费一条我消费一条。
问题:如果一个消费者的服务器特别慢怎么处理?不合理啊
采用限流+手工确认,假如10条消息,A处理的慢,B处理快,那么B就多处理几条。
channel.basicQos(1);

3、发布订阅模式

在这里插入图片描述
之前生产者面向的是队列,现在面向的是交换机
在这里插入图片描述
交换机的类型为"fanout".

  1. 生产者
public class Producer {

    private static final String EXCHANGE_NAME = "fanout_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //3.声明交换机
        //两个参数:String exchange, String type,“fanout”是转发
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
        //4.发送消息到交换机上
        for (int i = 0; i < 10; i++) {
            String message = "这是第"+i+"遍说我爱你";
            channel.basicPublish(EXCHANGE_NAME,"",null,message.getBytes());
        }

        System.out.println("发送消息成功!");
    }
}

消费者

  1. 消费者1
public class MyConsumer1 {

    private static final String EXCHANGE_NAME = "fanout_exchange";
    private static final String QUEUE_NAME = "fanout_exchange-queue-1";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //申明队列和绑定交换机
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"");

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者1:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}
  1. 消费者2
public class MyConsumer2 {

    private static final String EXCHANGE_NAME = "fanout_exchange";
    private static final String QUEUE_NAME = "fanout_exchange-queue-2";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //申明队列和绑定交换机
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"");

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者2:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

消费者需要声明队列,并且将队列绑定到交换机上。
不同的消费者,声明的队列不同。

4、routing模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
交换机的类型为:direct
生产者代码

public class Producer {

    private static final String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //3.声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"direct");
        //4.发送消息到交换机上
        String message = "重大足球消息:国足今晚只要打平就能出线";
        channel.basicPublish(EXCHANGE_NAME,"football",null,message.getBytes());

        String message2 = "重要篮球消息:只要连续赢12场,我们就能出线";
        channel.basicPublish(EXCHANGE_NAME,"basketball",null,message2.getBytes());

        System.out.println("发送消息成功!");
    }
}

交换机类型为direct!!!
消费者
消费者1:

public class MyConsumer1 {

    private static final String EXCHANGE_NAME = "direct_exchange";
    private static final String QUEUE_NAME = "direct_exchange-queue-1";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //申明队列和绑定交换机
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"football");

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者1:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

消费者2

public class MyConsumer2 {

    private static final String EXCHANGE_NAME = "direct_exchange";
    private static final String QUEUE_NAME = "direct_exchange-queue-2";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //申明队列和绑定交换机
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"basketball");
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"football");
        //可以关注两个消息。打个标记。

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者1:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

5、通配符模式

在这里插入图片描述

在这里插入图片描述
交换机的类型为“topic”
生产者

public class Producer {

    private static final String EXCHANGE_NAME = "topic_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //3.声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"topic");
        //4.发送消息到交换机上
        String message = "重大足球消息:国足今晚只要打平就能出线";
        channel.basicPublish(EXCHANGE_NAME,"tiyu.football",null,message.getBytes());

        String message2 = "重要篮球消息:只要连续赢12场,我们就能出线";
        channel.basicPublish(EXCHANGE_NAME,"tiyu.basketball",null,message2.getBytes());

        String message3 = "CBA:9冠王能否卫冕,我们拭目以待!";
        channel.basicPublish(EXCHANGE_NAME,"tiyu.basketball.cba",null,message3.getBytes());

        System.out.println("发送消息成功!");
    }
}

消费者1

public class MyConsumer1 {

    private static final String EXCHANGE_NAME = "topic_exchange";
    private static final String QUEUE_NAME = "topic_exchange-queue-1";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //申明队列和绑定交换机
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"tiyu.*");

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者1:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

用*去统配结果
在这里插入图片描述

消费者2

public class MyConsumer2 {

    private static final String EXCHANGE_NAME = "topic_exchange";
    private static final String QUEUE_NAME = "topic_exchange-queue-2";

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接,连接上MQ服务器
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.142.137");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/java1907");
        connectionFactory.setUsername("java1907");
        connectionFactory.setPassword("123");

        Connection connection = connectionFactory.newConnection();

        //2.基于这个连接对象,创建对应的通道
        Channel channel = connection.createChannel();

        //限流,最多只放行一个消息 //叫号系统 1-10
        channel.basicQos(1);

        //申明队列和绑定交换机
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"tiyu.#");

        //3.创建一个消费者对象,并且写好处理消息的逻辑
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body);
                System.out.println("消费者2:接收到的消息是:"+message);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //手工确认模式,告知MQ服务器,消息已经被正确处理
                //multiple表示是否批量确认
                //为true,则批量确认,假设envelope.getDeliveryTag()=10,意味着将1-10的消息都确认
                //为false,则只确认10
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        //4.需要让消费者去监听队列
        //autoACK=true:自动确认模式
        //autoACK=false:手工确认模式 (推荐)
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

用#去匹配
在这里插入图片描述

### MQ消费组常见错误类型及解决方案 #### 消费者错误 当消费者程序本身存在问题时,可能导致消息无法正常处理。这可能是由于代码逻辑错误、资源不足或其他运行时异常引起[^2]。 ```java // 示例:捕获并记录消费者的潜在错误 try { consumer.receive(); } catch (Exception e) { logger.error("Consumer encountered an error", e); } ``` #### Offset提交失败 Offset代表消费者已读取的位置。如果提交操作失败,则后续重启后可能会重复接收到之前的消息,或者跳过部分未确认接收的信息[^3]。 - **网络中断**:临时性的连接问题阻止了更新动作完成。 - **配置不当**:例如设置了自动提交间隔太短或太长都不合适;另外就是存储机制的选择也会影响可靠性。 针对上述情况建议采取措施如下: 1. 实施幂等性设计以应对可能存在的重复投递现象; 2. 调整合理的超时设置,并确保有稳定的持久化设施支持offset保存工作。 #### 并发/顺序消费模式下的特殊挑战 对于采用并发模型的应用来说,批量拉取消息时若个别项处理失败会造成整体回滚重试的现象,进而引发不必要的性能开销甚至死循环风险。而在严格要求次序保持的任务场景下则需特别注意单一线程串行执行所带来的效率低下隐患[^4]。 ```python # Python伪代码展示如何控制每次获取的最大数量 consumer.set_consume_message_batch_max_size(batch_size=...) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值