rabbitMQ知识概括

MQ简介

基于多线程队列简单实现mq:

public class MayiktThreadMQ {
   
    /**
     * Broker
     */
    private static LinkedBlockingDeque<JSONObject> broker = new 
    LinkedBlockingDeque<JSONObject>();

    public static void main(String[] args) {
   
        // 创建生产者线程
        Thread producer = new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                while (true) {
   
                    try {
   
                        Thread.sleep(1000);
                        JSONObject data = new JSONObject();
                        data.put("phone", "18611111111");
                        broker.offer(data);
                    } catch (Exception e) {
   

                    }

                }
            }
        }, "生产者");
        producer.start();
        Thread consumer = new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                while (true) {
   
                    try {
   
                        JSONObject data = broker.poll();
                        if (data != null) {
   
                            System.out.println(Thread.currentThread().getName() 
                            + ",获取到数据:" + data.toJSONString());
                        }
                    } catch (Exception e) {
   

                    }
                }
            }
        }, "消费者");
        consumer.start();
    }
}

基于netty实现mq:

  • 消费者netty客户端与nettyServer端MQ服务器端保持长连接,MQ服务器端保存消费者连接。
  • 生产者netty客户端发送请求给nettyServer端MQ服务器端,MQ服务器端在将该 消息内容发送给消费者。
  • 生产者投递消息给MQ服务器端,MQ服务器端需要缓存该消息。
    在这里插入图片描述
  • 消息格式:body:{"msg":{"userId":"123456","age":"23"},"type":"producer",”topic”:””}
  • 如果mq服务器端宕机之后,消息如何保证不丢失?
    持久化机制。
  • 如果mq接收到生产者投递消息,如果消费者不在的情况下,该消息是否会丢失?
    不会丢失,消息确认机制 必须要消费者消费该消息成功之后,在通知给mq服务器端 删除该消息。
  • Mq服务器端将该消息推送消费者:
    ①消费者已经和mq服务器保持长连接,服务器自动推送
    ②消费者第一次刚启动的时候,消费者主动拉取消息
  • Mq如何实现抗高并发思想?
    Mq消费者根据自身能力情况 ,拉取mq服务器端消息消费。
    默认的情况下是取出一条消息。
    缺点:存在延迟的问题
  • 如何消费者提高速率:
    消费者实现集群。
    消费者批量获取消息即可。
  • 总结:
    rabbitMQ的总体架构思想就是使用Netty的NIO模型通信。
    生产者和消费者操作时首先要向消息中间件进行连接操作。
    也就是说生产者和消费者相对于消息中间件都是Client,而消息中间件是Server。

RabbitMQ简介

RabbitMQ介绍:

  • RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),
  • RabbitMQ服务器是用Erlang语言编写的。
  • 链接:
    RabitMQ官方网站
    RabbitMQ概念详解

RabbitMQ基础概念:

  • 通常我们谈到消息队列服务, 会有三个概念: 发消息者、消息队列、收消息者。RabbitMQ 在这个基本概念之上, 多做了一层抽象,在发消息者和队列之间, 加入了交换器(Exchange)。这样发消息者和消息队列就没有直接联系,转而变成发消息者把消息发给交换器,交换器根据调度策略再把消息转发给消息队列。
  • 消息生产者并没有直接将消息发送给消息队列,而是通过建立与Exchange的Channel,将消息发送给Exchange。Exchange根据路由规则,将消息转发给指定的消息队列。消息队列储存消息,等待消费者取出消息。消费者通过建立与消息队列相连的Channel,从消息队列中获取消息。
  • 概念名词:
    Channel(信道):多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,复用TCP连接的通道。每个channel表示一个会话任务。
    Producer(消息的生产者):向消息队列发布消息的客户端应用程序。
    Consumer(消息的消费者):从消息队列取得消息的客户端应用程序。
    Message(消息):消息由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(消息优先权)、delivery-mode(是否持久性存储)等。
    Routing Key(路由键):消息头的一个属性,用于标记消息的路由规则,决定了交换机的转发路径。最大长度255 字节。
    Queue(消息队列):存储消息的一种数据结构,用来保存消息,直到消息发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将消息取走。需要注意,当多个消费者订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,每一条消息只能被一个订阅者接收。
    Exchange(交换器|路由器):提供Producer到Queue之间的匹配,接收生产者发送的消息并将这些消息按照路由规则转发到消息队列。交换器用于转发消息,它不会存储消息 ,如果没有 Queue绑定到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。交换器有四种消息调度策略(下面会介绍),分别是fanout, direct, topic, headers。
    Binding(绑定):用于建立Exchange和Queue之间的关联。一个绑定就是基于Binding Key将Exchange和Queue连接起来的路由规则,所以可以将交换器理解成一个由Binding构成的路由表。
    Binding Key(绑定键):Exchange与Queue的绑定关系,用于匹配Routing Key。最大长度255 字节。
    Broker:RabbitMQ Server,服务器实体。
    在这里插入图片描述
  • 关系:
    ①Producer与Exchange之间为一对多关系
    ②Exchange与Queue之间为多对多关系
    ③Queue与Consumer之间为多对多关系

RabbitMQ环境的基本安装:

  • 下载并安装erlang:
    ①链接:erlang下载地址
    ②配置erlang环境变量信息:
    <1>新增环境变量ERLANG_HOME=erlang的安装地址。
    <2>将%ERLANG_HOME%\bin加入到path中。
    ③cmd下用erl -version检测是否配置成功。
  • 下载并安装RabbitMQ
    ①链接:RabbitMQ下载地址
    ②配置环境变量:
    <1>新增环境变量RABBIT_HOME=rabbitmq的安装地址。
    <2>将%RABBIT_HOME%\sbin加入到path中。
    ③cmd下进入RabbitMQ Server目录下的sbin目录,用rabbitmqctl status检测RabbitMQ是否配置成功
    ④打开sbin目录,双击rabbitmq-server.bat即可启动rabbitmq。
    ⑤如果rabbitmq启动成功无法访问管理平台页面:
    <1>进入到F:\path\rabbitmq\rabbitmq\rabbitmq_server-3.6.9\sbin>
    <2>执行rabbitmq-plugins enable rabbitmq_management
  • Rabbitmq管理平台中心:
    ①地址 :http://127.0.0.1:15672
    ②默认账号:guest/guest ,用户可以自己创建新的账号。
  • 注意:RabbitMQ 它依赖于Erlang,需要先安装Erlang。不同JDK版本对应的Erlang和RabbitMQ Server的版本也会有所不同。

RabbitMQ常见名词:

  • Virtual Hosts:像mysql有数据库的概念并且可以指定用户对库和表等操作的权限。RabbitMQ也有类似的权限管理。在RabbitMQ中可以虚拟消息服务器VirtualHost,每个VirtualHost相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的,exchange、queue、message不能互通。
  • 默认的端口15672:rabbitmq管理平台端口号
  • 默认的端口5672: rabbitmq消息中间内部通讯的端口
  • 默认的端口号25672: rabbitmq集群的端口号

RabbitMQ信道channel概念:

  • 信道解释:
    ①信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值