代码编织梦想

什么情况使用MQ???

1.确实是用了有效果。即解耦、提速、削峰这些方面的收益,超过加入MQ,管理MQ这些成本。
2.生产者不需要从消费者处获得反馈。引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了继续往后走,即所谓异步成为了可能。
3.容许短暂的不一致性。

在这里插入图片描述

MQ的优势和劣势

1.优势

1.1应用解耦

使用MQ使得应用间解耦,提升容错性和可维护性

1.2异步提速

提升用户体验和系统吞吐量

1.3削峰填谷

使用MQ后,提高系统稳定性

2.劣势

2.1系统可用性降低

系统引入外部依赖越多,系统稳定性越差,一旦MQ宕机,就会对业务造成影响

如何保证MQ高可用?

2.2系统复杂度提高

MQ的加入大大增加了系统的复杂度,从系统间同步的远程调用,变为通过MQ异步调用

如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递的顺序性

2.3一致性问题

A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B、C系统处理成功,D系统处理失败,

如何保证消息数据处理的一致性?

AMQP

AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议
的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中
间件不同产品,不同的开发语言等条件的限制。2006年,AMQP 规范发布。类比HTTP。

JMS

JMS 即 Java 消息服务(JavaMessage Service)应用程序接口,是一个 Java 平台中关于面向消息中间件的API

JMS 是 JavaEE 规范中的一种,类比JDBC

很多消息中间件都实现了JMS规范,例如:ActiveMQ。RabbitMQ 官方没有提供 JMS 的实现包,但是开源社区有

RabbitMQ介绍

​ RabbitMQ是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统。支持多种语言,包括java、Python、ruby、PHP、C/C++等。

​ MQ:MQ是 message queue 的简称,是应用程序和应用程序之间通信的方法。
AMQP:advanced message queuing protocol ,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息并不受客户端/中间件不同产品、不同开发语言等条件的限制。
​ 消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支持,RPC 的调用等等。

在这里插入图片描述

# 架构相关概念

# Broker
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker
# Virtual host
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网
络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多
个vhost,每个用户在自己的 vhost 创建 exchange/queue 等
# Connection
Connection:publisher/consumer 和 broker 之间的 TCP 连接
# Channel
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection
的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线
程,通常每个thread创建单独的 channel 进行通讯,AMQP method 包含了channel id 帮助客户端和
message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 
极大减少了操作系统建立 TCP connection 的开销
# Exchange
Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到
queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
# Queue
Queue:消息最终被送到这里等待 consumer 取走
# Binding
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key。Binding 信息被保存
到 exchange 中的查询表中,用于 message 的分发依据

RabbitMQ安装

1. 安装依赖环境

在线安装依赖环境:

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz

2. 安装Erlang

erlang-18.3-1.el7.centos.x86_64.rpm
socat-1.7.3.2-5.el7.lux.x86_64.rpm
rabbitmq-server-3.6.5-1.noarch.rpm

# 安装
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
  • 使用yum更新安装依赖

    sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y
    
  • 下载rpm包

    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm &
    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm &
    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm &
    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm &
    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm &
    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm &
    wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/nscd-2.17-55.el6.x86_64.rpm &
    
  • 安装rpm包

    sudo rpm -Uvh *-2.17-55.el6.x86_64.rpm --force --nodeps
    
  • 安装完毕后再查看glibc版本,发现glibc版本已经到2.17了

    strings /lib64/libc.so.6 | grep GLIBC
    

3. 安装RabbitMQ

# 安装
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm

# 安装
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

4. 开启管理界面及配置

# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app 
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,只保留guest

5. 启动

service rabbitmq-server start # 启动服务
service rabbitmq-server stop # 停止服务
service rabbitmq-server restart # 重启服务
  • 设置配置文件
cd /usr/share/doc/rabbitmq-server-3.6.5/
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

6. 配置虚拟主机及用户

6.1. 用户角色

RabbitMQ在安装好后,可以访问http://ip地址:15672 ;其自带了guest/guest的用户名和密码;如果需要创建自定义用户;那么也可以登录管理界面后,如下操作:

在这里插入图片描述

角色说明

1、 超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

6.2. Virtual Hosts配置

像mysql拥有数据库的概念并且可以指定用户对库和表等操作的权限。RabbitMQ也有类似的权限管理;在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。 相当于mysql的db。Virtual Name一般以/开头。

6.2.1. 创建Virtual Hosts

6.2.2. 设置Virtual Hosts权限

在这里插入图片描述

RabbitMQ的工作模式

官网链接-工作模式介绍

在这里插入图片描述

Topics通配符模式 (比较重要,单独详解)

1.Topic 类型与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列。只不过 Topic 类型Exchange 可以让队列在绑定 Routing key 的时候使用通配符!
    
2.Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
    
3.通配符规则:# 匹配一个或多个词,* 匹配不多不少恰好1个词,例如:item.# 能够匹配 item.insert.abc 或者 item.insert,item.* 只能匹配 item.insert

在这里插入图片描述

工作模式总结

# 简单模式 HelloWorld
一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)。
# 工作队列模式 Work Queue
一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)。
# 发布订阅模式 Publish/subscribe
需要设置类型为 fanout 的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消
息发送到绑定的队列。
# 路由模式 Routing
需要设置类型为 direct 的交换机,交换机和队列进行绑定,并且指定 routing key,当发送消息到交换机
后,交换机会根据 routing key 将消息发送到对应的队列。
# 通配符模式 Topic
需要设置类型为 topic 的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送
消息到交换机后,交换机会根据 routing key 将消息发送到对应的队列。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_49122165/article/details/129657158

springboot 整合rabbitmq ,用心看完这一篇就够了-爱代码爱编程

该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。 (但是关于rabbitMq的安装,就不介绍了)   在安装完rabbitMq后,输入http://ip:15672/ ,是可以看到一个简单后台管理界面的。 在这

消息队列专题(架构篇):RabbitMQ 的集群架构模式-爱代码爱编程

RabbitMQ 的集群架构模式主要有四种,分别是主备模式、远程模式、多活模式和镜像模式,本篇博客将依次介绍这四种架构模式,其中的镜像模式使用范围最广,我们将对其进行重点介绍。 主备模式 主备模式是指,主节点负责提供读写服务,从节点只负责提供备份服务,当主节点宕机时,备份节点会自动切换为主节点提供读写服务。 如上图所示,在主备架构模式下,我们使用 H

RabbitMQ学习总结(三)之linux环境安装rabbitmq-爱代码爱编程

1.下载Rabbitmq         下载地址: 在官网下载与自己centos版本所对的erlang和rabbitmq的包 我的版本为centos7,下载的版本如下 。并且记住下载.rpm结尾的包 2.文件下载后上传到虚拟机中,我上传的位置是 可根据自己的习惯,进行文件的保存 3.安装文件         1.rpm -ivh e

深聊全链路压测之:第十九讲 | 如何对RabbitMQ 消息进行隔离。-爱代码爱编程

对RabbitMQ消息隔离 1、引言 2、方案落地 2.1 方案准备 2.2 技术预演 3、 数据实现 3.1 影子队列实现 3.2 数据偏移实现 4、总结 1、引言 这节课,我们来学习如何基于微服务技术落地 RabbitMQ 消息隔离。 RabbitMQ算是最受

RabbitMQ学习总结(二),RabbitMQ的概念与四大核心的概念-爱代码爱编程

作者处于学习阶段,刚刚完成RabbitMQ的学习,作为学生,我会用更通俗的说法,来叙述自己对RabbitMQ的了解。愿各位大佬看到有见解错误的地方和叙述不好的地方,能够帮忙纠正。来帮助大家更加深入的了解RabbitMQ。 1.概念 Rabbit是一个消息中间件,RabbitMQ是由Erlang语言编写的。RabbitMQ能实现消息的接受和发送。 2.

RabbitMQ学习总结(四)之消息分发机制-爱代码爱编程

作者处于学习阶段,刚刚完成RabbitMQ的学习,作为学生,我会用更通俗的说法,来叙述自己对RabbitMQ的了解。愿各位大佬看到有见解错误的地方和叙述不好的地方,能够帮忙纠正。来帮助大家更加深入的了解RabbitMQ。 一、RabbitMQ的分发机制 RabbitMQ有三种分发机制:轮询分发、不公平分发、预值分发。 二、轮询分发 轮询分发是默认的

RabbitMQ学习总结(六)之消息应答-爱代码爱编程

作者处于学习阶段,刚刚完成RabbitMQ的学习,作为学生,我会用更通俗的说法,来叙述自己对RabbitMQ的了解。愿各位大佬看到有见解错误的地方和叙述不好的地方,能够帮忙纠正。来帮助大家更加深入的了解RabbitMQ。 发布确认原理 生产者将信道设置为confirm模式, 信道上发布的每一条消息都会携带唯一的ID。当消息成功到达队列后,队列返回给生产

【博学谷学习记录】超强总结,用心分享|架构师-消息中间件mq_小花样的博客-爱代码爱编程

文章目录 一、消息队列作用二、消息队列种类三、持久化四、分布式五、通讯模式六、消息队列的优缺点七、消息队列选型 一、消息队列作用 消息队列的主要是解决什么问题?主要是解决异步消息、流量削峰、应用解耦。实现高性

【博学谷学习记录】超强总结,用心分享|架构师-rabbitmq消息可靠性保障_小花样的博客-爱代码爱编程

文章目录 一、生产者保证1.1 失败通知1.2 发送方确认1.3 Broker丢失消息 二、消费方消息可靠性2.1 消费者手动确认 消息依靠三个对象:生产者、消费者、broker 一、生产者保证

【博学谷学习记录】超强总结,用心分享前端|移动端基础-爱代码爱编程

目录 移动端 布局 百分比布局 Flex布局 移动适配 rem vw/vh 响应式网页 移动端 PC端与移动端的区别:PC端屏幕大,页面大多固定版心;手机端屏幕小,网页宽度大多为100% 屏幕尺寸:指的是屏幕对角线的长度,一般用英尺来度量 分辨率:物理分辨率物理分辨率是生产屏幕时就固定的,不可被改变;逻辑分辨率是由软件(驱动)