RabbitMQ相关知识点梳理

本文详细介绍了RabbitMQ的基础知识,包括RabbitMQ的端口、角色分类、消息传递流程和核心组件。此外,还探讨了RabbitMQ的集群高可用方案,包括普通模式和镜像模式,并解析了持久化机制和内存控制策略。最后,文章讨论了RabbitMQ确保消息可靠性的方法,包括发送、存储和消费的可靠性。
摘要由CSDN通过智能技术生成

一、RabbitMQ入门简介

RabbitMQ是一个开源的AMQP实现,服务器端使用Erlang语言编写,支持多种客户端。它用于分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。以下是RabbitMQ的安装过程,文档可百度云自取(当然也可以用Docker版安装): 链接: rabbitmq单机到集群完整搭建 提取码: r6a2
RabbitMQ会绑定一些端口,分别如下:
(1)4396:Erlang的端口/结点映射程序,用来跟踪节点名称监听地址,在集群中类似DNS的作用;
(2)5672、5671:AMQP客户端端口,没有使用SSL和使用SSL的端口;
(3)25672:用于RabbitMQ节点间和Cli工具通信,配合4396使用;
(4)15672:HTTP_API端口,管理员用户才能访问,是管理RabbitMQ的可视化界面,需要启用management插件;
(5)61613、61614:当STOMP插件启用时打开,作为STOMP客户端端口(根据是否使用TLS选择);
(6)1883、8883:当MQTT插件启用时打开,作为MQTT客户端端口;
(7)15674:基于WebSocket的STOMP客户端端口;
(8)15675:基于WebSocket的MQTT客户端。
在RabbitMQ中还有角色分类的概念,分别如下:
(1)none:不能访问management plugin;
(2)management:用户可以通过AMQP做的任何事并且加上:
  <1>列出自己可以通过AMQP登入的virtualHosts;
  <2>查看自己的virtualHosts中的queues、exchanges和bindings;
  <3>查看和关闭自己的channels和connections;
  <4>查看有关自己的virtualHosts和“全局”的统计信息,包含其他用户在这些virtualHosts中的活动;
(3)policymaker:management可以做的任何事并且加上查看、创建和删除自己的virtualHosts所处的policies和parameter;
(4)monitoring:management可以做的任何事并且加上:
  <1>列出所有virtualHosts包括他们不能登陆的virtualHosts
  <2>查看其他用户的channels和connections;
  <3>查看节点级别的数据和clustering和memery的使用情况;
  <4>查看真正的关于所有virtualHosts的全局统计信息。
(5)administrator:policymaker和management可以做的任何事并且加上:
  <1>创建和删除virtualHosts;
  <2>查看、创建和删除user;
  <3>查看、创建和删除permission;
  <4>关闭其他用户的connections。
安装完RabbitMQ后登陆Web管理端界面如下:
在这里插入图片描述
RabbitMQ中有一些名词如下:
(1)producer:消息生产者,发送消息的一方,发送消息到RabbitMQ,消息包括消息体(即自定义的消息)和附加信息(如交换器名称、RoutingKey和一些自定义的属性);
(2)consumer:消息消费者,消费消息的一方,接收RabbitMQ的消息,它无需知道生产者是谁;
(3)broker:消息中间件的服务节点,可以认为是单个的服务器;
(4)virtualHost:虚拟主机(简称vhost),表示一批交换机、消息队列和相关对象,虚拟主机共享相同身份认证和加密环境(类似数据库中一个库的概念),默认的vhost为“/”;
(5)channel:建立在connection之上的轻量级连接,一个connection中可有多个channel(类似光缆中的光纤);
(6)routingKey:路由键,根据此键路由到指定的exchange上;
(7)exchange:交换器,生产者发送消息由它负责路由到不同的queue上,如果路由不到则返回给生产者或者直接丢弃消息;exchange包含以下四种类型:
  <1>fanout:消息发到此类型exchange上,与它绑定的queue都会收到消息;
  <2>direct:消息发到此类型exchange上,只有全匹配queue与exchange绑定上的routingKey才会接收到消息;
  <3>topic:消息发到此类型exchange上,模糊匹配queue与exchange绑定上的routingKey即可接收到消息;
  <4>headers:消息发到此类型exchange上,根据属性值匹配上的queue会接收到消息(一般不用);
(8)queue:消息队列,用于存储消息,一个queue可以对应多个消费者,但是不会出现重复发送同一消息给不同消费者的情况;
(9)binding:绑定关系,指exchange和queue的绑定关系,也会指定一个routingKey。
对应以上的名词解释,RabbitMQ的架构图如下:
在这里插入图片描述
以下是RabbitMQ结合Java代码的使用示例:
(1)生产者:

/**
 * Topic--生产者
 * <p>
 * 生产者将消息发送到topic类型的交换器上,和routing的用法类似,都是通过routingKey路由,但topic类型交换器的routingKey支持通配符
 */
public class Producer {
   
    public static void main(String[] args) {
   
        // 1、创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2、设置连接属性
        factory.setHost("192.168.70.128");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("123456");

        Connection connection = null;
        Channel channel = null;
        try {
   
            // 3、从连接工厂获取连接
            connection = factory.newConnection("生产者");
            // 4、从链接中创建通道
            channel = connection.createChannel();
            // 路由关系如下:com.# --> queue-1     *.order.* ---> queue-2
            // 消息内容
            String message = "Hello A";
            // 发送消息到topic_test交换器上
            channel.basicPublish("topic-exchange", "com.order.create", null, message.getBytes());
            System.out.println("消息 " + message + " 已发送!");
            // 消息内容
            message = "Hello B";
            // 发送消息到topic_test交换器上
            channel.basicPublish("topic-exchange", "com.sms.create", null, message.getBytes());
            System.out.println("消息 " + message + " 已发送!");
            // 消息内容
            message = "Hello C";
            // 发送消息到topic_test交换器上
            channel.basicPublish("topic-exchange", "cn.order.create", null, message.getBytes());
            System.out.println("消息 " + message + " 已发送!");
        } catch (IOException e) {
   
            e.printStackTrace();
        } catch (TimeoutException e) {
   
            e.printStackTrace();
        } finally {
   
            // 7、关闭通道
            if (channel != null && channel.isOpen()) {
   
                try {
   
                    channel.close();
                } catch (IOException e) {
   
                    e.printStackTrace();
                } catch (TimeoutException e) {
   
                    e.printStackTrace();
                }
            }
            // 8、关闭连接
            if (connection != null && connection.isOpen()) {
   
                try {
   
                    connection.close();
                } catch (IOException e) {
   
                    e.printStackTrace();
                }
            }
        }
    }
}

(2)消费者:

/**
 * 路由--消费者
 * <p>
 * 消费者通过一个临时队列和交换器绑定,接收发送到交换器上的消息
 */
public class Consumer {
   
    private static Runnable receive = new Runnable() {
   
        @Override
        public void run() {
   
            // 1、创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            // 2、设置连接属性
            factory.setHost("192.168.70.128");
            factory.setPort(5672);
            factory.setUsername("guest");
            factory.setPassword("123456");

            Connection connection = null;
            Channel channel = null;
            final String queueName = Thread.currentThread().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值