游客您好
第三方账号登陆
  • 点击联系客服

    在线时间:8:00-16:00

    客服电话

    020-85534346

    电子邮件

    81058337@qq.com
  • 码云社APP

    随时掌握码云社动态

  • 扫描二维码

    关注砺锋微信公众号

RabbitMQ如何保证消息99.99%被发送成功?

发布时期:2019-7-8 11:00
阅读:547 回复:0

1. 本篇概要RabbitMQ针对这个问题,提供了以下几个机制来解决:生产者确认持久化手动Ack本篇博客我们先讲解下生产者确认机制,剩余的机制后续单独写博客进行讲解。2. 生产者确认要想保证消息不丢失,首先我们得保证 ...

1. 本篇概要

RabbitMQ针对这个问题,提供了以下几个机制来解决:

  1. 生产者确认
  2. 持久化
  3. 手动Ack

本篇博客我们先讲解下生产者确认机制,剩余的机制后续单独写博客进行讲解。

2. 生产者确认

要想保证消息不丢失,首先我们得保证生产者能成功的将消息发送到RabbitMQ服务器。

但在之前的示例中,当生产者将消息发送出去之后,消息到底有没有正确地到达服务器呢?如果不进行特殊配置,默认情况下发送消息的操作是不会返回任何消息给生产者的,也就是默认情况下生产者是不知道消息有没有正确的到达服务器。

从basicPublish方法的返回类型我们也能知晓:

public void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException {    this.basicPublish(exchange, routingKey, false, props, body);}

为了更好理解,我们将之前的生产者Producer类中的channel.queueDeclare(QUEUE_NAME, false, false, false, null);注释:

package com.zwwhnly.springbootaction.rabbitmq.helloworld;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;import java.util.concurrent.TimeoutException;public class Producer {    private final static String QUEUE_NAME = "hello";    public static void main(String[] args) throws IOException, TimeoutException {        // 创建连接        ConnectionFactory factory = new ConnectionFactory();        // 设置 RabbitMQ 的主机名        factory.setHost("localhost");        // 创建一个连接        Connection connection = factory.newConnection();        // 创建一个通道        Channel channel = connection.createChannel();        // 指定一个队列,不存在的话自动创建        //channel.queueDeclare(QUEUE_NAME, false, false, false, null);        // 发送消息        String message = "Hello World!";        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());        System.out.println(" [x] Sent '" + message + "'");        // 关闭频道和连接        channel.close();        connection.close();    }}

此时运行代码,因为队列不存在,消息肯定没地方存储,但是程序却并未出错,也就是消息丢失了但是我们却并不知晓。

RabblitMQ针对这个问题,提供了两种解决方案:

  1. 通过事务机制实现
  2. 通过发送方确认(publisher confirm)机制实现

3. 事务机制

TOOBUG(开发工程师)-本文作者
一个毫无志向的程序员,我就是我,不是toobug
547 0 2019-7-8 11:00
本文暂无评论,快来抢沙发!

扫一扫关注官方微信号

最前沿的技术信息一手掌握

滚动新闻
CODESEEDING(码云社)一家致力于程序员成长、以内容为核心、以提问为引导的多元化成长社区。我们在线上为技术爱好者提供了一个优质的交流氛围环境,在线下同样和众多高校联合开办了技术沙龙品牌。
020-85534346
关注我们
  • 访问移动H5版
  • 官方微信公众号

码云社 - CODESEEDING 2.0© 2018-2019 码云社. TOOBUG ( 粤ICP备16114193号-3 )