什么是MQ

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

其主要用途:不同进程Process/线程Thread之间通信。

为什么会产生消息队列?有几个原因:

  • 不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;

  • 不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了

MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。

RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMQP协议中间的几个重要概念

  • Server:接收客户端的连接,实现AMQP实体服务。

  • Connection:连接,应用程序与Server的网络连接,TCP连接。

  • Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。

  • Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。由Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。

  • Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。

  • Exchange:交换机,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换机常用类型有direct、topic、fanout、headers四种,后面详细介绍。

  • Binding:绑定,交换机和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。

  • RoutingKey:路由键,生产者将消息发送给交换机的时候,会发送一个RoutingKey,用来指定路由规则,这样交换机就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。

  • Queue:消息队列,用来保存消息,供消费者消费。

VirtualHost

在RabbitMQ中可以虚拟消息服务器VirtualHost,每个VirtualHost相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。

在RabbitMQ中无法通过AMQP创建VirtualHost,可以通过以下命令来创建。

rabbitmqctl add_vhost [vhostname]

也可以通过WEB管理插件来创建。

ConnectionFactory、Connection、Channel

ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionFactory为Connection的制造工厂。

Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

我们完全可以直接使用 Connection 就能完成信道的工作,为什么还要引入信道呢?

试想这样一个场景, 一个应用程序中有很多个线程需要从 RabbitMQ 中消费消息,或者生产消息,那么必然需要建立很多个 Connection,也就是许多个 TCP 连接。然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。RabbitMQ 采用 TCP 连接复用的方式,不仅可以减少性能开销,同时也便于管理。

下图是AMQP的协议模型:

Exchange 常用交换机

RabbitMQ常用的交换机类型有fanout、direct、topic、headers四种。

Fanout Exchange

该类型不处理路由键,会把所有发送到交换机的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。

Direct Exchange

该类型的交换机将所有发送到该交换机的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey完全一致的队列中。

Topic Exchange

该类型的交换机将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。

Exchange将RoutingKey和某Topic进行模糊匹配,其中“*”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而”com.*“只能匹配到“com.rabbitmq”。

Headers Exchange

该类型的交换机不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换机性能差,在实际中并不常用。

安装 RabbitMQ

yum

进入/etc/yum.repos.d/文件夹

创建rabbitmq-erlang.repo 文件,内容如下

[rabbitmq-erlang]name=rabbitmq-erlangbaseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/21/el/7gpgcheck=1gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.ascrepo_gpgcheck=0enabled=1

创建rabbitmq.repo 文件,内容如下

[bintray-rabbitmq-server]name=bintray-rabbitmq-rpmbaseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/8/gpgcheck=0repo_gpgcheck=0enabled=1
yum install rabbitmq-server

使用Docker进行安装RabbitMQ。

进入“官方下载地址”,选择使用Docker安装,前往“dockerhub”查看镜像。

  1. 拉取镜像和启动

    docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.8.0-beta.4-management
  2. 查看镜像

    [root@localhost ~]# docker imagesREPOSITORY              TAG                       IMAGE ID            CREATED             SIZEdocker.io/rabbitmq      3.8.0-beta.4-management   d0f93d2b83f7        3 days ago          180 MB

打开浏览器访问localhost:15672
进行填写账号密码:默认账号密码都是guest.

运行

启用插件页面管理

rabbitmq-plugins enable rabbitmq_management

创建用户

rabbitmqctl add_user admin mypassword# 赋予权限rabbitmqctl set_user_tags admin administratorrabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

浏览器访问http://机器IP:15672打开管理界面,使用上一步配置好的admin账号登录

docker安装rocketmq_RabbitMQ 介绍amp;安装相关推荐

  1. Docker的简单介绍与安装(Windows10)

    目录 1.什么是Docker 2.Docker的应用场景 3.Docker 的优点 4.Docker 架构 5.Doker安装 Win10 系统 开启 Hyper-V 1.安装 Toolbox 2.运 ...

  2. docker 技术的介绍和安装(一)

    文章目录 一.文章参考 二.why Docker 软件开发环境搭建的问题 解决办法(虚拟机) 解决办法(Linux 容器) 虚拟机 VS linux 容器 三.linux 容器的封装技术 -- Doc ...

  3. docker第一章--介绍和安装

    转载于:https://www.cnblogs.com/caiciadeliliang/p/10993278.html

  4. tengine简单安装_Tengine介绍和安装

    Tengine特性 继承Nginx-1.6.2的所有特性,兼容Nginx的配置: 动态模块加载(DSO)支持.加入一个模块不再需要重新编译整个Tengine: 支持SO_REUSEPORT选项,建连性 ...

  5. 「docker实战篇」python的docker爬虫技术-在linux下mitmproxy介绍和安装(四)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「docker实战篇」python的docker爬虫技术-在linux下mitmproxy介绍和安装(四) 上次说了fiddl ...

  6. Docker:基于ubuntu18.04的介绍,安装与使用 - 最新无死角

    以下链接是个人关于深度学习环境搭建的所有链接,包含了各个框架: 深度学习环境搭建-史上最全无死角系列 有兴趣的朋友可以添加微信 17575010159 相互交流. 注意:本人编写该博客的时间为2020 ...

  7. docker介绍和安装以及常用命令

    介绍 Docker是基于Go语言实现的云开源项目. 一次镜像,处处运行 传统的部署项目环境配置相当麻烦,换一台机器,就要重来一次,费力费时. Docker的主要目标是"一次镜像,随处运行&q ...

  8. Day15(Js入门、jquery入门、ajax入门、前后端分离开发跨域问题、linux环境准备、jdk_tomcat环境搭建、docker介绍及应用(docker安装、基本命令、安装tomcat))

    js入门 js代码辅助 window–>preferences–>javaScript–>Content Assist .abcdefghijklmnopqrstuvwxyz alt ...

  9. 容器-Docker《一》介绍和安装

    容器-Docker Docker资源 Docker官方英文资源: docker官网:http://www.docker.com Docker windows入门:https://docs.docker ...

最新文章

  1. wpf 加载本地html文件,c# – Wpf WebBrowser加载javascript
  2. c语言常用指令翻译,c语言常见专业词汇带翻译
  3. 程序员效率:如何合理的分解任务
  4. Delphi对话框初始地址InitialDir
  5. Redis进阶实践之十六 Redis大批量增加数据
  6. xss植入_前端安全之XSS攻击
  7. java异常处理思考题_java异常处理试题及答案
  8. Windows版本nginx
  9. [滤镜]的firefox兼容问题
  10. JQuery 使用技巧
  11. mui ajax的值php怎样获取,MUI.ajax是怎么获取数据的
  12. Golang 基础:接口使用、实现原理(eface iface)和设计模式
  13. STM32单片机驱动L298N
  14. 胆结石的发病原因有哪些?
  15. 从0开始搭建Hadoop2.x高可用集群(HDFS篇)
  16. 林业调查规划设计资质申办流程及要求?
  17. 宽带波束形成 恒定束宽波束形成 学习笔记
  18. 一篇带你了解如何使用纯前端类Excel表格构建现金流量表
  19. 500万相机芯片尺寸_相机常见感光芯片的几何尺寸
  20. 电脑流量监控软件监控局域网员工电脑流量使用情况

热门文章

  1. http2-stream-optima-prioritation
  2. 用chattr保护文件系统的安全
  3. 数据备份软件,BackBone,NetVault,网络存储备份,系统集成
  4. 机器学习项目实战----信用卡欺诈检测
  5. PSP DAILY软件功能说明书
  6. 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
  7. CC2431 代码分析③-忍辱负重的CC2430
  8. NES模拟器开发-CPU笔记
  9. Javascript模块规范(CommonJS规范AMD规范)
  10. the application has stopped unexpected。please try again