RabbitMQ入门学习01

01-课程介绍

核心部分

1、Hello World                 简单模式

2、Work queues              工作模式

3、Publish/Subscribe       发布、订阅模式

4、Routing                        路由模式

5、Topics                          主题模式

6、Publisher Confirms      发布确认模式

高级部分

1、死信队列

2、延迟队列

3、发布确认高级 

      3.1 发布确认

      3.2 回退消息

      3.3 备份交换机

4、幂等性

5、优先级队列

6、惰性队列

集群部分

1、Clustering

2、镜像队列(为了数据不丢失)

3、Haproxy + Keepalive实现高可用负载均衡

4、Federation  Exchange(两大同步数据的组件)

5、Federation  Queue

6、Shovel (同步数据的插件)

课程特点

1、新 rabbitmq-server-3.8.8-1.el7

2、细 从安装开始配置  详情使用 代码级

3、真 文档内部全来自企业真实案例

4、全 全套资料

技术基础要求

要求

1、Javase

2、Javaee

3、Maven

4、Springboot

建议

1、Java基础

2、Linux系统命令基础

3、分布式集群思想

02-什么是MQ

MQ(message queue)消息队列,从字面意思上看,本质是个队列,FIFO先入先出(遵循原则--就像一个水桶,水要想装满这个桶,先进的水在水桶的底部,后进的水在水桶的上部,最终水桶被装满),只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息(什么是上下游传递信息呢?就好比QQ号,A同学想发消息给B同学,那么A同学就称为上游,B同学就称为下游,A同学与B同学之间传递消息,就称之为上下游传递消息)。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。

03-MQ的流量消峰

举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒才能收到下单成功的操作,但是比不能下单的体验要好。(防止订单系统宕机)

MQ可以对访问的人员进行排队

04-MQ的应用解耦

以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,下单用户感受不到物流系统的故障,提升系统的可用性。 

订单系统一旦执行完成,它才会发消息给队列,后续任务就由队列来完成了,此时的订单系统其实已经早早的结束了,队列会分配消息给支付系统、库存系统、物流系统,直到三大系统执行完成,在执行的过程中,这三个有一个完成不了,队列会监督它,继续完成,直至完成结束,所以不会出现任何一个故障之后,影响整个所有系统的运转,这就是队列。

05-MQ的异步处理

有些服务间调用是异步的,例如 A 调用 B,B需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完。以前一般有两种方式, A过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callback api, B执行完之后调用 api 通知 A 服务。

这两种方式都不是很优雅,使用消息队列,可以很方便解决这个问题, A 调用 B 服务后(A可以做自己的事情),只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api, 也不用提供 callback api。同样 B 服务也不用做这些操作。A服务还能及时的得到异步处理成功的消息。

06-MQ的分类

1、ActiveMQ

优点:

缺点

2、Kafka:

优点:

缺点:

3、RocketMQ

优点:

缺点:

4、RabbitMQ

          2007 年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

          优点:由于erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备,健壮、稳定、易用、跨平台、支持多种语言 如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持 AJAX 文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高

   https://www.rabbitmq.com/news.html

            缺点:商业版需要收费,学习成本较高

07-MQ的选择

1、Kafka

2、RocketMQ

3、RabbitMQ

结合erlang 语言本身的并发优势,性能好时效性微秒级,社区活跃度也比较高,管理界面用起来十分方便,如果你的数据量没有那么大,中小型公司优先选择功能比较完备的 RabbitMQ

08-四大核心概念

1、RabbitMQ的概念

RabbitMQ是一个消息中间件:它接收并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑 RabbitMQ 是一个快递站,一个快递员帮你传递快递。RabbitMQ 与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。

2、四大核心概念

生产者

       产生数据发送消息的程序是生产者

交换机

        交换机是 RabbitMQ非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定

队列

        队列是RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式

消费者

        消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

09-原理名词解释

1、RabbitMQ核心部分(六大模式)

 2、各个名词介绍

Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker(消息实体)

Virtual host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似与网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange / queue 等。多租户就是表示Broker里面可以有多个Virtual host,而每个Virtual host又包含多个交换机和信道,它们是包含关系,相当于是消息实体里面有多个Virtual host,而每一个Virtual host又有多个交换机。

Connection:publisher / consumer 和 broker之间的 TCP连接(每个连接里面有多个信道)

Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method包含了 channel id帮助客户端和 message broker识别 channel,所以channel之间是完全隔离的。Channel 作为轻量级的Connection极大减少了操作系统建立TCP connection 的开销发消息的通道,简称信道)

Exchange:message到达 broker的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue中去。常用的类型有:direct(point-to-point),topic(publish-subscribe)and fanout(multicast)-----一个交换机可以对应多个队列

Queue:消息最终被送到这里等待 consumer取走

Binging:exchange和queue之间的虚拟连接,binging中可以包含routing key,Binding信息被保存到exchange中的查询表中,用于message的分发依据

总结:

channel信道,每一个生产者与MQ之间会有建立一个连接 Connection,而每个连接里面有多个信道。每一个信道相当于一个逻辑连接,每次发消息只占用一个信道,不会占用整个连接,而每个连接里有多个信道就可以发多次的消息。这就是信道与连接之间的关系。

10、安装

linux系统( secondCentOS8

11、安装Web界面插件

12、添加用户并设置权限

一个Virtual Hosts代表MQ的一个库,不同的Virtual Hosts它的交换机和队列是不一样的

13-创建Java开发环境

由生产者发送消息,发给MQ,再由MQ将消息转发到消费者,完成一次消息的通信。

RabbitMQ工作原理:

告诉我们,当你生产者与MQ之间建立了连接之后,连接并不是发消息的,一个连接里面可以产生多个信道,而每一个信道是专门发消息的,所以我们应该通过连接获取里面的信道,才是我们的目的。通过信道就可以连接我们的交换机和队列

/**
 * 生产者:发消息
 */
public class Producer {
    //队列名称
    public static final String QUEUE_NAME = "hello";

    //发消息
    public static void main(String[] args) throws Exception {
        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //工厂IP 连接RabbitMQ的队列
        factory.setHost("192.168.142.131");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("123");

        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel =connection.createChannel();
        /**
         * 生成一个队列
         * 1、队列名称
         * 2、队列里面的消息是否持久化 默认情况消息存储在内存中
         * 3、该队列是否只供一个消费者进行消费 是否进行消息共享,true可以多个消费者消费 false:只能一个消费者消费
         * 4、是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true自动删除 false不自动删除
         * 5、其它参数
         */
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //发消息
        String message = "hello world";//初次使用

        /**
         * 发送一个消息
         * 1、发送到哪个交换机
         * 2、路由的Key值是哪个 本次是队列的名称
         * 3、其它参数信息
         * 4、发送消息的消息体
         */
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        System.out.println("消息发送完毕");
    }
}

16-工作队列原理

 注意事项:一个消息只能被处理一次,不可以处理多次

消费在手动应答时是不丢失、放回队列中重新消费

29-消息持久化

队列是MQ当中的一个组件,消息是生产者发过来的消息。队列如果持久化了,但是消息不持久化,依然是不能保证消息是不丢失的。因为消息一旦不能持久化,工作线程一旦执行失败,消息也会丢失,只是队列不会丢失,但是队列里面的消息丢失了。所以我们在发消息的时候,一定要记住生产者就应该通知队列这个消息是需要持久化的,不能随便的丢失,所以生产者的代码是需要改的。

32-发布确认原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值