RabbitMQ原理,学习笔记

一、rabbitmq简介

1.1 MQ介绍——什么是MQ

消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。

  • 其主要用途:不同进程Process/线程Thread之间通信。
    为什么会产生消息队列?有几个原因:
    1.不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
    2.不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;
    MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。本文主要介绍RabbitMq

1.2 RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
下面将重点介绍RabbitMQ中的一些基础概念,了解了这些概念,是使用好RabbitMQ的基础。

1.3 rabbitmq实现原理

核心组件:Exchange & Queue
RabbitMQ的两大核心组件是Exchange 和 Queue,以下是它的运行原理图:

在这里插入图片描述
图中,绿色的 X 就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型。
Exchange,又称交换器,它接受消息和路由信息,然后将消息发送给消息队列。 对于每个虚拟主机内部,交换器有独一无二的名字。应用程序在其权限范围之内可以自由的创建、共享、使用和销毁交换器实例。 交换器可以是持久的、临时的或者自动删除的。持久交换器会一直存在于服务器,直到它被显式删除;临时交换器会工作到服务器被关闭时为止;而一旦没有应用程序使用自动删除交换器,它就会被服务器自动删除掉。
消息队列是一个具名缓冲区,它们代表一组消费者应用程序保存消息。这是一个先进先出的数据结构,服务器会将从某一个生产者发出的同等优先级的消息按照它们进入队列的顺序传递给某个消费者,万一某些消息不能被消费者处理,它们可能会被打乱顺序重新传递。

那么当我的MQ服务器在发生宕机后时可能对应的ExChange、Queue、以及在消息队列中的还没来得及处理的消息,这时候就面临一个持久化问题

持久化
队列和交换机有一个创建时候指定的标志durable(持久化)。durable的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立,它不表示说在队列当中的消息会在重启后恢复。这一块,可以根据服务器的实际使用场景,来决定是关注消息的处理速度还是关注消息的内容,那么就可以进行不同的持久化。
绑定
所谓绑定,就是将每个特定的Exchange和特定的Queue进行绑定,绑定关键字为BindingKey。Exchange 和Queue的绑定可以是多对多的关系,每个发送给Exchange的消息都有一个叫做RoutingKey的关键字,Exchange要想将该消息转发给特定队列,该队列与交换器的BindingKey必须与消息的RoutingKey相匹配才行。 为了进一步了解绑定过程,必须先了解Exchange的常见三种类型:

  • 直接式交换器模式(direct)
    通过精确匹配消息的路由关键字,将消息路由到零个或者多个队列中,绑定关键字用来将队列和交换器绑定到一起。这让我们可以构建经典的点对点队列消息传输模型,不过和任何已定义的交换器类型一样,当消息的路由关键字与多个绑定关键字匹配时,消息可能会被发送到多个队列中。通俗点来说,就是指定特殊唯一的RountingKey,Exchange会指定到对应的队列中,下面的图片可以解释这部分内容
    在这里插入图片描述
    同时,direct也可以进行多路绑定,也就是一个Exchange可以同时绑定多个队列Queue,贴出一张图,便于理解:
    在这里插入图片描述
  • 广播式交换器模式(fanout)
    不论消息的路由关键字是什么,这条消息都会被路由到所有与该交换器绑定的队列中。不使用任何参数将消息队列与交换器绑定在一起。 发布者(直接式交换器类型描述中的producer变成了publisher,已经隐含了二种交换器类型的区别)向交换器发送一条消息。 消息被无条件的传递到所有和这个交换器绑定的消息队列中。
    在这里插入图片描述
    Exchange会将所有消息发送到所有与该交换器绑定的队列中去。
  • 主题式交换器类型(topic)
    :通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。这种路由器类型可以被用来支持经典的发布/订阅消息传输模型——使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的多个消费者。绑定关键字用零个或多个标记构成,每一个标记之间用“.”字符分隔。绑定关键字必须用这种形式明确说明,并支持通配符:“*”匹配一个词组,“#”零个或多个词组。 因此绑定关键字“*.message.#”匹配路由关键字“user.message”和“order.message.database”,但是不匹配“message.snapshot”。
    在这里插入图片描述

1.4 简易安装过程
Ubuntu中安装命令

sudo apt-get update
sudo apt-get install erlang-nox
sudo apt-get install rabbitmq-server

安装成功之后,我们需要进行操作用户的相关配置

# 添加用户名和密码,用户名设置为自己系统的操作用户名
sudo rabbitmqctl add_user username password
# 添加用户的属性,这里可设置的值有一下几种
  • administrator 可登录管理控制台(启用management plugin的情况下),查看所有的信息,并且可以对用户、策略(policy)进行操作;
  • monitoring 可登录管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数、内存使用情况,磁盘使用情况等);
  • policymaker 可以登录管理控制台(启用management plugin的情况下),同时可以对策略(policy)进行操作;
  • management 仅可登录管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理;
  • 其他 无法登录管理控制台,通常就是普通的生产者和消费者。
sudo rabbitmqctl set_user_tags username administrator
# 赋予virtual host中所有资源的配置、写、读权限以便管理其中的资源
sudo rabbitmqctl set_permissions -p / usernane '.*' '.*' '.*'

至此,RabbitMQ相关的安装和配置工作差不多结束了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值