zoukankan      html  css  js  c++  java
  • Rabbitmq详解

    目录

    一、介绍二、相关概念1. 主要组成部分2. 工作流程介绍3. 交换机及路由规则介绍三、主要队列使用0. 源码查看1. 普通队列 源码:blog-study:mq:rabbitmq - mq012. 多消费队列 源码:blog-study:mq:rabbitmq - mq023. 直连交换机(direct)队列 源码:blog-study:mq:rabbitmq - mq034. 主题交换机(topic)队列 源码:blog-study:mq:rabbitmq - mq045. 扇形交换机(fanout)队列 源码:blog-study:mq:rabbitmq - mq05四、SpringBoot集成Rabbitmq

    一、介绍

    先介绍我,在介绍rabbitmq,首先我之前只是简单的用过activemq,其它mq都没有接触过,rabbitmq是因为我现在的公司使用的是这个mq而且在我看来存在问题,没有消息可靠投递与消费失败等等问题的考虑,所以我决定好好学一下,我也是刚接触rabbitmq没多久,所以这篇定位只是简单学习使用rabbitmq,写的不好请多多体谅,多多指点,至于那些问题我可能会写到开发问题整理里面

    关于为什么使用mq上一篇博客已介绍 点击查看

    RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗.
    AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

    二、相关概念

    1. 主要组成部分

    • 发送者(Producer):发送消息
    • 消费者(Consumer):接收消息
    • 队列(Queue):存储消息的缓存
    • 消息(Message):由发送者通过RabbitMQ发送给消费者的信息
    • 连接(Connection):连接RabbitMQ和应用服务器的TCP连接
    • 通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的
    • 交换机(Exchange):发送者将消息发送到交换机,然后由交换机通过路由键匹配到队列,然后将消息转发到队列,其实交换机就是做匹配转发的工作
    • 绑定(Binding):绑定是将队列、交换机和路由键绑定到一起
    • 路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。

    2. 工作流程介绍

    1. 不管发送者还是消费者首先都需要与rabbitmq服务器先建立连接这个很好理解没有连接肯定无法通信,然后创建通道,为什么要创建通道:
      如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
    2. 创建交换机、队列、队列交换机之间进行绑定。
    3. 发送消息到交换机由交换机转发到队列
    4. 消费者消费消息结束

    3. 交换机及路由规则介绍

    rabbitmq和其它mq不太一样是有一个交换机的概念,我觉得交换机给与rabbitmq很大的灵活性,可用通过路由规则实现各种需求,不过想深入体会还是要靠运行代码一点一点感受。下面介绍四种类型的交换机
    四种交换机类型介绍:

    1. 直连(Direct):该交换机的使用需要路由键与交换机和队列进行绑定,队列的绑定可以很灵活,一个队列可以绑定多组交换机和路由键
    2. 扇形(Fanout):扇形交换机会将消息发送到所有和它进行绑定的队列上。
    3. 主题(Topic):主题交换机会将路由键和绑定上的模式进行通配符匹配。
    4. 消息头(Headers):消息头交换机使用消息头的属性进行消息路由。好像不怎么用就不详细说了。感兴趣的可以自己研究一下。

    三、主要队列使用

    下面五种队列都是带有源码的,第一种和第二种只是简单队列,看源码的时候注意虽然没有配置交换机,但rabbitmq内部是使用的默认交换机,可以通过rabbitmq管理后台看到队列其实绑定的是默认交换机, 这两个示例也是对后面三个的引导
    后面三个示例就是介绍前三种交换机的,可以自己动手试一下

    0. 源码查看

    源码查看规则

    1. 普通队列 源码:blog-study:mq:rabbitmq - mq01

    该队列很简单,就是发送者发送消费者消费仅此而已

    普通队列普通队列

    2. 多消费队列 源码:blog-study:mq:rabbitmq - mq02

    这个是一个队列有多个消费消费的情况
    主要想说一点就是: 针对多消费情况默认rabbitmq是将消息分成等比例给消费者消费
    如果存在有的消费者性能好消费快的情况,就会出现浪费资源的情况
    所以针对这种情况
    channel.basicQos(1);
    加上这样一条代表只要消费确认消息rabbitmq就会再发一条给该消费者,这样性能好的消费者就可以多消费一些, 但要注意所有消费者都要添加该命令

    多消费者队列多消费者队列

    下面是介绍交换机的,等消息到了队列逻辑就和上面两个一样了

    3. 直连交换机(direct)队列 源码:blog-study:mq:rabbitmq - mq03

    首先创建交换机创建队列, 该模式的交换机是通过路由键来匹配队列的,只要队列绑定了相应的交换机和路由键,当发送消息时交换机就会路由到相应的队列, 如图,也可以看出同一个队列可以绑定多组交换机和路由键

    直连交换机直连交换机

    4. 主题交换机(topic)队列 源码:blog-study:mq:rabbitmq - mq04

    该模式的交换机,在队列绑定交换机和路由键时,路由键可以模糊匹配

    1. 路由键需要是一串字符串用 “.” 隔开 如: test.topic.testqueue
    2. * 匹配一个单词, #匹配零个或多个单词 如:test.* 只能匹配 test.test 或者test.ttt 但是不能匹配 test.test.queue .*的位置可以是任意单词
      而: test.# 可以匹配 test.test 或 test.test.queue .#后面不管有多少都行
      具体可以运行源码试一下
      主题交换机主题交换机

    5. 扇形交换机(fanout)队列 源码:blog-study:mq:rabbitmq - mq05

    这个模式的交换机简单, 只要绑定这个交换机的队列都可以拿到消息,也就是说只要发消息给这个交换机其下绑定的所有队列都可以收到

    扇形交换机扇形交换机

    四、SpringBoot集成Rabbitmq

    源码:blog-study:mq:rabbitmq-springboot
    该部分主要是springboot对rabbitmq的集成和使用,源码注释应该比较清晰吧,上面看明白这一块应该不成问题
    特别的加了一个死信队列的概念
    什么是死信队列,就是消息队列在绑定交换机的同时也要绑定死信队列(其实死信队列就是一个普通队列),当正常队列消费失败是,消息会自动转发到死信队列,由死信队列再次消费。
    以下几种情况会让消息变为死信:

    • 消息被拒绝(basic.reject / basic.nack),并且requeue = false
    • 消息TTL过期
    • 队列达到最大长度

    根据设定消息过期时间可以制作成延时队列,我没加,感兴趣的可以自己试一下。

  • 相关阅读:
    HDU 1051 Wooden Sticks (贪心)
    PHP中递归函数的一个常见逻辑问题
    【Android界面实现】使用Canvas对象实现“刮刮乐”效果
    vue2.0
    vuex3
    nodejs中require的路径是一个文件夹时发生了什么
    vue2
    vuex
    echarts
    node21---mongoose
  • 原文地址:https://www.cnblogs.com/chunyun/p/12036057.html
Copyright © 2011-2022 走看看