RabbitMQ:

  RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。

AMQP协议:

  AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品、不同的开发语言等条件的限制。

  AMQP的实现有:RabbitMQ、OpenAMQ、Apache Qpid、Redhat Enterprise MRG、AMQP Infrastructure、ØMQ、Zyre等。

典型应用场景:

1、跨系统的异步通信 ,异步,解耦,削峰都有体现。

2、应用内的同步变成异步 秒杀:自己发送给自己

3、基于Pub/Sub模型实现的事件驱动 放款失败通知、提货通知、购买碎屏保 系统间同步数据 摒弃ELT(比如全量同步商户数据); 摒弃API(比如定时增量获取用户、获取产品,变成增量广播)。

4、利用RabbitMQ实现事务的最终一致性

RabbitMQ的特性:

  RabbitMQ使用Erlang语言编写,使用Mnesia数据库存储消息。

  1. 可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  2. 灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
  3. 消息集群(Clustering) 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
  4. 高可用(Highly Available Queues) 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  5. 多种协议(Multi-protocol) RabbitMQ 支持多种消息队列协议,比如 AMQP、STOMP、MQTT 等等。
  6. 多语言客户端(Many Clients) RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby、PHP、C#、JavaScript 等等。
  7. 管理界面(Management UI) RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点。
  8. 插件机制(Plugin System)RabbitMQ提供了许多插件,以实现从多方面扩展,当然也可以编写自己的插件。

工作模型:

  当消息生产者/(消费者)要生产/(消费)消息的时候需要与服务器建立一个长连接,在RabbitMQ中叫做Connection,为了解决客户端与服务器所产生的频繁的连接问题,由于会大量的消耗服务器内存,这里引入了消息通道的概念,在保持长连接的情况下。可以通过建立Channel的方式与服务器通讯,当有请求的时候就会建立通道,结束则关闭通道。在RabbitMQ中,一般的做法不会让消息直接发送到消息队列中,这里引入了Exchange(交换机)的概念,通过交换机来实现消息更加灵活的消息分发,交换机没有实际的进程,而队列是有的,它只是一个地址列表,在队列创建的时候会与Exchange绑定一个专属的 key ,在生产者生产消息的时候也会指定这个key,那么 Exchange 就会通过这个key去匹配 Queue,从而实现灵活分发。然后消费者会通过订阅指定的队列去消费消息。在RabbitMQ中有Virtual Host 虚拟机的概念,他可以当成是一个小型的MQ,一个RabbitMQ服务器上可以有多个虚拟机,相互之间是隔离的,当然不同的虚拟机之间可以有相同命名的交换机与队列,可以实现资源的隔离。

Exchange交换机:

  最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

Direct Exchange 直连交换机:

  定义:直连类型的交换机与一个队列绑定时,需要指定一个明确的binding key。路由规则:发送消息到直连类型的交换机时,只有routing key跟binding key完全匹配时,绑定的队列才能收到消息。

  示例:

// 只有队列1能收到消息
channel.basicPublish("MY_DIRECT_EXCHANGE", "key1", null, msg.getBytes());

Topic Exchange 主题交换机:

  定义:主题类型的交换机与一个队列绑定时,可以指定按模式匹配的routing key。通配符有两个,*代表匹配一个单词。#代表匹配零个或者多个单词。单词与单词之间用 . 隔开。路由规则:发送消息到主题类型的交换机时,routing key符合binding key的模式时,绑定的队列才能收到消息。

  示例:

// 只有队列1能收到消息
channel.basicPublish("MY_TOPIC_EXCHANGE", "sh.abc", null, msg.getBytes());
// 队列2和队列3能收到消息
channel.basicPublish("MY_TOPIC_EXCHANGE", "bj.book", null, msg.getBytes());
// 只有队列4能收到消息
channel.basicPublish("MY_TOPIC_EXCHANGE", "abc.def.food", null, msg.getBytes());

Fanout Exchange 广播交换机:

  定义:广播类型的交换机与一个队列绑定时,不需要指定binding key。路由规则:当消息发送到广播类型的交换机时,不需要指定routing key,所有与之绑定的队列都能收到消息。

Headers Exchanges:

  不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。匹配规则x-match有下列两种类型:

  x-match = all :表示所有的键值对都匹配才能接受到消息。

  x-match = any :表示只要有键值对匹配就能接受到消息。

Linux下安装RabbitMQ:

  系统版本:CentOS Linux release 7.5.1804 (Core)

  RabbitMQ版本:3.6.12

  Erlang版本:erlang-19.0.4-1.el7.centos.x86_64

  JDK版本:1.8

Erlang安装:

  Erlang包安装:https://www.erlang.org/downloads/19.0 下载对应安装包 otp_src_19.0.tar.gz

  添加依赖:确实啥依赖可以百度

yum install ncurses-devel
yum list | grep ssl
yum install openssl-devel
yum list | grep ODBC
yum install unixODBC-devel
yum install gcc-c++yum install fop.noarch
apt install libwxgtk3.0-dev
yum install -y gcc gcc-c++
yum -y install gtk2-devel binutils-devel
yum install mesa-libGLU-devel.x86_64
yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
yum install fop.noarch

  解压:tar -xf otp_src_19.0.tar.gz ,重命名下 mv otp_src_19.0 otp

  进入目录安装:./configure --prefix=/usr/local/erlang --without-javac & make & make install (时间有点小长)

  如果老是提示jinterface : Java compiler disabled by user,尝试去掉--without-javac

  需要安装wxWidgets:如果还报错可以自行百度,基本都是依赖环境没有装。

  Can not link the wx driver, wx will NOT be useable 可以直接忽略。直接进入make

下载地址:http://www.wxwidgets.org/downloads/
wget https://netix.dl.sourceforge.net/project/wxwindows/3.0.1/wxWidgets-3.0.1.tar.bz2
bzip2 -dkv wxWidgets-3.0..tar.bz2
tar -xvf wxWidgets-3.0..tar
cd wxWidgets-3.0./
./configure --with-opengl --enable-debug --enable-unicode
make && make install

  cd /usr/local/erlang/bin  执行 ./erl 出现以下即安装完成:

  如果提示没有这个目录,查看自己make的时候是否成功。一定要确保 make & make install 是没问题的。

  添加环境变量:export PATH=$PATH:/usr/local/erlang/bin

RabbitMQ安装:

  下载安装包:http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/ 选择 rabbitmq-server-generic-unix-3.6.12.tar.xz 下载

  上传至服务器,我这边放在 /mysoft 下。Mq安装包默认是xz结尾的,解压xz文件后得到tar文件

xz -d rabbitmq-server-generic-unix-3.6.12.tar.xz

  执行解压命令 tar -xvf rabbitmq-server-generic-unix-3.6.12.tar

  添加环境变量:export PATH=$PATH:/mysoft/rabbitmq_server-3.6.12/sbin

  环境变量生效:source  /etc/profile

  配置网页插件:

  首先创建目录,否则可能报错:mkdir /etc/rabbitmq

  启动mq:./rabbitmq-server -detached

  进入 sbin 目录,启用插件:./rabbitmq-plugins enable rabbitmq_management

  启用rabbitmq_management插件去管理rabbitmq服务,但是在访问管理界面使用guest用户登录时出现login failed错误。到服务器上查询日志显示出现错误的原因是:

HTTP access denied: user 'guest' - User can only log in via localhost。

  rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。如果想使用guest/guest通过远程机器访问,需要在rabbitmq配置文件中(/mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config)中设置loopback_users为[]。rabbitmq.config文件需要自己创建,完整内容如下(注意后面的半角句号):

[{rabbit, [{loopback_users, []}]}].

  重启,再通过访问 http://192.168.254.137:15672 ,通过guest/guest 登陆:

  查看服务状态:rabbitmqctl status

  关闭服务:rabbitmqctl stop

  查看mq用户:rabbitmqctl list_users

  查看用户权限:rabbitmqctl list_user_permissions guest

  新增用户: rabbitmqctl add_user admin 123456

  设置角色:rabbitmqctl set_user_tags admin administrator

  赋予管理员权限:rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

rabbitmqctl set_permissions -p [Vhost_Name][username][conf][write][read]

  conf:一个正则表达式match哪些配置资源能够被该用户访问

  write:一个正则表达式match哪些配置资源能够被该用户读。

  read:一个正则表达式match哪些配置资源能够被该用户访问

  根据个人需求更改rabbitmq的环境变量:

  创建环境变量配置文件 vim /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq-env.conf 

RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia //数据库位置
RABBITMQ_LOG_BASE=/data/rabbitmq/log //日志文件目录

  创建数据库目录及日志目录:

mkdir  /data/rabbitmq/mnesia
mkdir /data/rabbitmq/log
chowm -R rabbitmq:rabbitmq /data/rabbitmq

  默认状态下 日志存放位置 /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq 下面,通过查看日志,在启动的时候会输出以下信息:

=INFO REPORT==== 24-Jan-2019::22:25:38 ===
Starting RabbitMQ 3.6.12 on Erlang 19.0.4
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/ =INFO REPORT==== 24-Jan-2019::22:25:38 ===
node : rabbit@localhost
home dir : /root
//配置文件位置
config file(s) : /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config
cookie hash : aRQYNdsONCZK2FIkVnK0bA==
//日志文件
log : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost.log
sasl log : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost-sasl.log
//数据库位置
database dir : /mysoft/rabbitmq_server-3.6.12/var/lib/rabbitmq/mnesia/rabbit@localhost
//内存信息
=INFO REPORT==== 24-Jan-2019::22:25:40 ===
Memory high watermark set to 389 MiB (408762777 bytes) of 974 MiB (1021906944 bytes) total =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Enabling free disk space monitoring =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Disk free limit set to 50MB =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Limiting to approx 924 file handles (829 sockets) =INFO REPORT==== 24-Jan-2019::22:25:40 ===
FHC read buffering: OFF
FHC write buffering: ON =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Priority queues enabled, real BQ is rabbit_variable_queue =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Starting rabbit_node_monitor =INFO REPORT==== 24-Jan-2019::22:25:40 ===
Management plugin: using rates mode 'basic' =INFO REPORT==== 24-Jan-2019::22:25:40 ===
msg_store_transient: using rabbit_msg_store_ets_index to provide index =INFO REPORT==== 24-Jan-2019::22:25:40 ===
msg_store_persistent: using rabbit_msg_store_ets_index to provide index
//AMQP端口
=INFO REPORT==== 24-Jan-2019::22:25:40 ===
started TCP Listener on 0.0.0.0:5672
//管理端口
=INFO REPORT==== 24-Jan-2019::22:25:40 ===
Management plugin started. Port: 15672
//数据库加载完成
=INFO REPORT==== 24-Jan-2019::22:25:40 ===
Statistics database started.
//插件加载
=INFO REPORT==== 24-Jan-2019::22:25:40 ===
Server startup complete; 6 plugins started.
* rabbitmq_management
* rabbitmq_management_agent
* rabbitmq_web_dispatch
* amqp_client
* cowboy
* cowlib

  这段日志包含了RabbitMQ的版本号、Erlang的版本号、RabbitMQ服务节点名称、cookie的hash值、RabbitMQ配置文件地址、内存限制、磁盘限制、默认账户guest的创建以及权限配置等等。

RabbitMQ配置:

  配置属性、 说明以及默认值如下所示

  • spring.rabbitmq.addresses:客户端连接的地址, 有多个的时候使用逗号分隔 , 该地址可以是IP与Port的结合
  • spring.rabbitmq.cache.channel.checkout-timeout:当缓存已满时,获取Channel的等待时间,单位为毫秒
  • spring.rabbitmq.cache.channel.size:缓存中保待的Channel数量
  • spring.rabbitmq.cacbe.connection.mode:连接缓存的模式,默认 CHANNEL
  • spring.rabbitmq.cache.connection.size:缓存的连接数
  • spring.rabbitmq.connection-timeout:连接超时参数, 单位为毫秒; 设置为"0"代表无穷大
  • spring.rabbitmq.dynamic:默认创建 一 个 AmqpAdmin的Bean ,默认值true
  • spring.rabbitmq.host:RabbitMQ的主机地址 localhost
  • spring.rabbitmq.listener.acknowledge-mode:容器的acknowledge 模式
  • spring.rabbitmq.listener.auto-startup:启动时自动启动容器 true
  • spring.rabbitmq.listener.concurrency:消费者的最小数量
  • spring.rabbitmq.listener.default-requeue-rejected:投递失败时是否重新排队 true
  • spring.rabbitmq. Iistener.max-concurrency:消费者的最大数噩
  • spring.rabbitmq.listener.prefetch:在单个请求中处理的消息个数, 它应该大于等于事务数量
  • spring.rabbitmq.listener.retry.enabled:不论是不是重试的发布 false
  • spring.rabbitmq.listener.retry.initial-interval:第 一 次与第二次投递尝试的时间间隔 1000
  • spring.rabbitmq.listener.retry.max-attempts :尝试 投递消息的最大数量 3
  • spring.rabbitmq.listener.retry.max-interval: 两次尝试的最大 时间间隔 10000
  • spring.rabbitmq.listener.retry.multiplier: 上 一 次尝试 时间间隔的乘数 1.0
  • spring.rabbitmq.listener.retry.stateless: 不论重试是有状态的还是无状态的 true
  • spring.rabbitmq.listener.transaction-size: 在 一 个 事务中处理的消息数量。 为了获得最佳效果, 该值应设置为小于等于每个请求中处 理 的 消 息个数, 即 spring.rabbitmq. listener.prefetch的值
  • spring.rabbitmq.password: 登录到RabbitMQ的密码
  • spring.rabbitmq.port:RabbitMQ的端口号 5672
  • spring.rabbitmq.publisher-confinns: 开启Publisher Confirm机制 false
  • spring rabbitmq publisher-returns: 开启PublisherReturn机制 false
  • spring rabbitmq.requested-heartbeat: 请求心跳超时时间, 单位为秒
  • spring rabbitmq.ssl.enabled: 启用SSL支持 false
  • spring.rabbitmq.ssl.key-store: 保存SSL证书的地址
  • spring.rabbitmq.ssl.key-store-password: 访问SSL证书的地址使用的密码
  • spring.rabbitmq.ssl.trust-store: SSL的可信地址
  • spring.rabbitmq.ssl.trust-store-password: 访问SSL的可信地址的密码
  • spring.rabbitmq.ssl.algonthm: SSL算法,默认使用Rabbit的客户端算法库
  • spring.rabbitmq.template.mandatory: 启用强制消息 false
  • spring.rabbitmq.template.receive-timeout: receive ()方法的超时时间 。
  • spring.rabbitmq.template.reply-timeout: sendAndReceive()方法的超时时间 5000
  • spring.rabbitmq.template.retry.enabled :设置为true的时候RabbitTemplate能够实现重试  false
  • spring.rabbitmq.template.retry.initial-interval: 第 一 次与第二次发布消息的时间间隔 1000
  • spring.rabbitmq.template retry.max-attempts :尝试发布消息的最大数量 3
  • spring.rabbitmq.template.retry.max-interval :尝试发布消息的最大时间间隔 10000
  • spring.rabbitmq.template.retry.multiplie:r 上 一 次尝试时间间隔的乘数 1.0
  • spring.rabbitmq. usemame: 登录到RabbitMQ的用户名
  • spring.rabbitmq.virtual-host: 连接到Rabb1tMQ的虚拟主机

RabbitMQ基础知识及Linux安装的更多相关文章

  1. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  2. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  3. 转:RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  4. RabbitMQ基础知识详解

    什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...

  5. RabbitMQ基础知识(转载)

    RabbitMQ基础知识(转载) 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需 ...

  6. 基础知识全面LINUX

    学习Linux系统的重要性应该不用多说,下面我就对Linux的基础知识进行一个全面而又简单的总结.不过建议大家还是装个Linux系统多练习,平时最好只在Linux环境下编程,这样会大有提高. linu ...

  7. RabbitMQ基础知识篇

    1.Linux安装RabbitMQ. 参考网址:RPM安装RabbitMQ   仔细阅读. 先安装erlang: su -c 'rpm -Uvh http://mirrors.neusoft.edu. ...

  8. Nginx入门篇-基础知识与linux下安装操作

    我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...

  9. (转)rabbitMQ基础知识及命令语句

    摘要: 整理rabbitmq的用户管理相关知识,备忘 安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. ...

随机推荐

  1. 控制结构(5): 必经之地(using)

    // 上一篇:局部化(localization) // 下一篇:最近最少使用(LRU) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 前情回顾 上一周,我们谈到了分支/卫语句 ...

  2. php之swoole安装与基本使用

    扩展安装: 参考GitHub地址 安装: 1. 使用PHP官方的PECL工具安装 (初学者) pecl install swoole 2. 从源码编译安装 (推荐) git clone https:/ ...

  3. Linux 学习 (四) 帮助命令

    Linux达人养成计划 I 学习笔记 man 命令 获取指定命令的帮助 man的级别 1:查看命令的帮助 2:查看可被内核调用的函数的帮助 3:查看函数和函数库的帮助 4:查看特殊文件的帮助(主要是/ ...

  4. python基础3 字符串常用方法

    一. 基础数据类型 总览 int:用于计算,计数,运算等. 1,2,3,100...... str:'这些内容[]'    用户少量数据的存储,便于操作. bool: True, False,两种状态 ...

  5. python之模块、包的导入过程和开发规范

    摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...

  6. Java基础-1

    基础知识 1.进制 1.十进制 2.二进制 3.十六进制 2.十六进制转换 二进制转换 十进制转换

  7. 2.3 os 模块

    目录 2.3.1 功能 2.3.2 常用方法 2.3.2.1 创建相关 2.3.2.2 切换相关 2.3.2.3 查看相关 2.3.2.4 编辑相关 2.3.2.5 删除相关 2.3.1 功能 2.3 ...

  8. 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】

    [bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...

  9. 题解:[APIO/CTSC 2007]数据备份

    你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已 ...

  10. expansion pattern ‘Frame&’ contains no argument packs

    camera/CameraImpl.h::: error: expansion pattern ‘Frame&’ contains no argument packs void read_fr ...