rabbitmq

57 阅读2分钟

功能

  • 流量消峰
  • 应用解耦
  • 异步处理

启动

需要erlang:25.3环境

启动rabbitmq image-20230408095814492

ui

http://localhost:15672

依赖

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <!--rabbitmq 依赖客户端-->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.8.0</version>
    </dependency>
    <!--操作文件流的一个依赖-->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
</dependencies>

原理

image-20230327144550463

消息应答

为了保证消息在发送过程中不丢失,rabbitmq 引入消息应答机制,消息应答就是:消费者在接收 到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了,rabbitmq 可以把该消息删除了。

如果消费者在没有发送ack的情况下死亡(其通道关闭、连接关闭或TCP连接丢失), RabbitMQ将理解消息没有被完全处理,并将它重新排队。如果同时有其他消费者在线,它会迅速将它重新交付给另一个消费者。这样,您可以确保没有消息丢失,即使工作人员偶尔会死亡。

消费者交付确认强制超时(默认为30分钟)。这有助于发现从不承认交货的有问题的(卡住的)消费者。可以再配置文件修改。

自动应答

消息发送后立即被认为已经传送成功

boolean autoAck = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAck, deliverCallback, consumerTag -> { });

手动应答

  • Channel.basicAck(用于肯定确认) RabbitMQ 已知道该消息并且成功的处理消息,可以将其丢弃了。basicAck方法的参数是 deliveryTag和multiple。 - deliveryTag:表示此次确认消息的标识符,用来标识消费者接收到的消息的编号。 - multiple:表示是否批量确认,如果设置为true,则表示确认所有小于等于deliveryTag的消息,如果设置为false,则仅确认当前消息。
  • Channel.basicNack(用于否定确认) 消息重回队列
  • Channel.basicReject(用于否定确认) 与 Channel.basicNack 相比少一个参数 不处理该消息了直接拒绝,可以将其丢弃了

MQ的basicRecover、basicCancel和basicGet是AMQP中的三个方法,分别用于重新投递未确认消息、取消一个消费者和获取消息。

  • basicRecover方法的参数为requeue,表示是否将消息重新加入队列。如果requeue为true,则消息将重新加入队列,等待下一个消费者处理;如果requeue为false,则消息将被放弃。
  • basicCancel方法的参数为consumer tag,表示要取消的消费者的标识符。当一个消费者不再需要接收消息时,可以使用basicCancel方法将其从队列中删除。
  • basicGet方法的参数为queue、noAck和consumerTag,分别表示要获取消息的队列、是否自动确认消息和消费者的标识符。如果noAck为true,则表示接收到消息后自动确认,否则需要手动确认。如果consumerTag没有指定,则会创建一个新的消费者标识符。