RabbitMQ简单介绍

18. RabbitMQ

18.1. RabbitMQ简介

  1. 首先引入一个消息队列中间件概念: 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性[架构] 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
  2. RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbitMQ配置的转发机制接收服务端发来的消息。RabbitMQ依据指定的转发规则进行消息的转发、缓冲和持久化操作,主要用在多服务器间或单服务器的子系统间进行通信,是分布式系统标准的配置。
  3. RabbitMQ的使用场景: 服务解耦流量削峰异步调用
  • 服务解耦:
    • 假设有这样一个场景, 服务A产生数据, 而服务B,C,D需要这些数据, 那么我们可以在A服务中直接调用B,C,D服务,把数据传递到下游服务即可,但是,随着我们的应用规模不断扩大,会有更多的服务需要A的数据,如果有几十甚至几百个下游服务,而且会不断变更,再加上还要考虑下游服务出错的情况,那么A服务中调用代码的维护会极为困难,这是由于服务之间耦合度过于紧密
    • A服务只需要向消息服务器发送消息,而不用考虑谁需要这些数据;下游服务如果需要数据,自行从消息服务器订阅消息,不再需要数据时则取消订阅即可
  • 流量削峰:
    • 假设我们有一个应用,平时访问量是每秒300请求,我们用一台服务器即可轻松应对而在高峰期,访问量瞬间翻了十倍,达到每秒3000次请求,那么单台服务器肯定无法应对,这时我们可以考虑增加到10台服务器,来分散访问压力,但如果这种瞬时高峰的情况每天只出现一次,每次只有半小时,那么我们10台服务器在多数时间都只分担每秒几十次请求,这样就有点浪费资源了
    • 流量削峰情况下,瞬间出现的大量请求数据,先发送到消息队列服务器,排队等待被处理,而我们的应用,可以慢慢的从消息队列接收请求数据进行处理,这样把数据处理时间拉长,以减轻瞬时压力
  • 异步调用:
    • 考虑定外卖支付成功的情况,支付后要发送支付成功的通知,再寻找外卖小哥来进行配送,而寻找外卖小哥的过程非常耗时,尤其是高峰期,可能要等待几十秒甚至更长。这样就造成整条调用链路响应非常缓慢
    • 引入RabbitMQ消息队列,订单数据可以发送到消息队列服务器,那么调用链路也就可以到此结束,订单系统则可以立即得到响应,整条链路的响应时间只有200毫秒左右,寻找外卖小哥的应用可以以异步的方式从消息队列接收订单消息,再执行耗时的寻找操作

原文链接:RabbitMQ_rabbitmq csdn-CSDN博客

18.2. 一些概念解析

  • RabbitMQ Server:也叫broker server,它是一种传输服务。他的角色就是维护一条从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。
  • Producer:消息生产者,如图A、B、C,数据的发送方。消息生产者连接RabbitMQ服务器然后将消息投递到Exchange
  • Consumer:消息消费者,如图1、2、3,数据的接收方。消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者。
  • Exchange:生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃)Exchange并不存储消息。RabbitMQ中的Exchange有direct、fanouttopic、headers四种类型,每种类型对应不同的路由规则。
  • Queue:(队列)是RabbitMQ的内部对象,用于存储消息。消息消费者就是通过订阅队列来获取消息的,RabbitMQ中的消息都只能存储在Queue中,多个消费者可以订阅同一个Queue,其中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。
  • RoutingKey:生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则。
Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列
Queue: 消息队列载体,每个消息都会被投入到一个或多个队列
Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来
Routing Key: 路由关键字,exchange根据这个关键字进行消息投递
Producer: 消息生产者,就是投递消息的程序
Consumer: 消息消费者,就是接受消息的程序
Channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
注 :由Exchange、Queue、RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。

18.3. RabbitMQ的三种模式

18.3.1. 直接模式

<dependency> 
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-amqp</artifactId> 
</dependency> 

消息一次发给一个队列

18.3.2. 分裂模式

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。

  1. 可以理解为路由表的模式
  2. 这种模式不需要RouteKey
  3. 这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
  4. 如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

18.3.3. 主题模式

  1. 任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上。此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模糊匹配的意思,a.# #.b a.b
  2. 注:交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息。任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue
  3. 新建一个交换器,类型选择topic -- 点击新建的交换器topictest
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitMQApplication.class)
public class RabbitTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    public void send1(){//给队列中放东西测试
        String message = "1111111_syx";
        rabbitTemplate.convertAndSend("syx01","直接添加队列"+message);
    }

    @Test
    public void send2(){//给队列中放东西测试
        String message = "1111111_syx";
        rabbitTemplate.convertAndSend("syx","","分裂添加队列"+message);
    }

    @Test
    public void send3(){//给队列中放东西测试
        String message = "1111111_syx";
        rabbitTemplate.convertAndSend("bx","a.111","主题添加队列a.#==="+message);
    }
    
spring:
  rabbitmq:
    host: 192.168.134.128
server:
  port: 8081
@Component
@RabbitListener(queues = "syx01")
public class RabbitMQLinster01 {
    @RabbitHandler
    public void get(String message){
        System.out.println("syx01接收到的信息"+message);
    }
}

RabbitMQ是一个消息代理。它通过发送消息和接收消息来实现消息传递的功能。在介绍RabbitMQ的基础之前,我们需要了解一些常用的管理工具,如rabbitmqctl和rabbitmq-plugins,它们用于管理RabbitMQ服务器。 在开始使用RabbitMQ之前,我们可以通过一个简单的"helloworld"例子来了解它的基本使用方法。我们可以发送一个消息"helloworld"并接收它。同时,这个例子还会涉及到RabbitMQ的基本概念,例如交换机和队列。 这些是RabbitMQ的基本介绍,它是一个功能强大的消息代理系统,用于实现消息传递。在后续的文章中,我们将会更深入地了解RabbitMQ,并进行性能测试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [RabbitMQ基础概念详细介绍](https://blog.csdn.net/qq_40704861/article/details/123067104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [RabbitMQ基本概念和使用](https://download.csdn.net/download/weixin_38678022/14962733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值