RabbitMQ学习(一)

消息队列


1. AMQP 和 JMS

AMQP : 标准高级消息队列协议 应用层协议的一个开放标准 为面向消息中间件设计

不受开发语言等条件的限制. 定义数据在客户端和服务端的传递规则

JMS : Java 平台面向消息中间件的API 规范数据如何进行操作 便于消息系统中的java

应用进行消息交换 并且通过提供标准的产生 发送 接收消息的接口简化企业应用的开发

也就是java消息服务

  • JMS 是定义了统一接口 对消息操作进行统一 ; AMQP通过规定协议同意数据交互

的格式

  • JMS 限定了必须使用java语言 AMQP只是协议 不规定使用语言

  • JMS规定了两种消息模型 ( Queue topic) 而AMQP的消息模型更加丰富

1.2 常见的消息队列产品
  • ActiveMQ : 基于JMS
  • RabbitMQ : 基于AMQP协议 erlang语言开发稳定性好
  • RocketMQ : 基于JMS 阿里巴巴产品 目前交由Apache基金会
  • Kafka : 分布式消息系统 高吞吐量 处理日志 scala 和 java 编写 归属于Apache基金会

2. RabbitMQ 介绍

2.1 搜索与商品服务的问题
    - 商品的原始数据保存在数据库里面 增删改查都在数据库中完成
    - 搜索服务数据来源是索引库 如果数据库商品发生变化 索引库数据能否及时更新

如果我们在后台修改了商品的价格 搜索页面依旧是旧的价格 这样显然不对 该如何解决?

注意:我们要确保数据一致性

  • 方法1 : 每当后台对商品做增删改操作 同时要修改索引库数据
  • 方法2: 搜索服务对外提供操作接口 后台在商品增删改后 调用接口(服务间相互调用)
  • 方法3: 消息队列 ( 消除代码的耦合 ) 异步进行操作
2.2 消息队列

生产者消费者模型

MQ三大功能 :

  • 异步 异步进行消息处理
  • 解耦 服务间通过消息中间件进行调用
  • 削峰 请求限流 削峰

rabbitMQ的特点:

  • 可靠性:
  • 灵活的路由
  • 消息集群
  • 高可用
  • 多种协议
  • 多语言客户端
  • 管理界面
  • 跟踪机制
  • 插件机制
2.3 rabbitMQ的基本概念

Message

消息,消息是不具名的,他有消息头和消息体组成 消息体是不透明的

而消息头则有一系列的可选属性组成,这些属性包括

routing-key(路由键) priority(相对于其他消息的优先权)

delivery-mode 支出该消息可能需要持久性存储

Publisher

消息的生产者 也是一个像交换器发布消息的客户端应用程序

Exchange

交换器 用来接收生产者发送的消息并将这些消息路由给服务器中的队列

Binding

绑定 用于消息队列和交换器之间的关联 一个绑定就是基于路邮件将交换器和

消息队列链接起来的路由规则 所以可以将交换器理解为一个由绑定构成的路由表

Queue

消息队列 用于保存消息直到发送给消费之 他是消息的容器 也是消息的重点

一个消息可投入一个或者多个队列 消息一直在队列里面 等待消费者连接到这个队列

将其取走

Connection

网络连接 比如一个TCP连接

channel

信道 多路复用连接中的一条独立的双向数据流通道 信道是建立在正式的TCP连接内的

虚拟连接 AMQP命令都是通过信道发送出去的 不管是发布消息 订阅队列还是

接收消息 这些操作都是通过信道完成 因为对于操作系统来说建立和销毁TCP都是

非常昂贵的开销 所以引入了信道的概念 以此复用一条TCP连接

Consumer

消息的消费者 表示一个从消息队列中取得消息的客户端应用程序

Virtual Host

虚拟主机 表示一批交换器 消息队列和相关对象 虚拟主机是共享相同身份

认证和加密环境的独立服务器域 每个Vhost本质上就是一个mini版的RabbitMQ服务器

拥有自己的队列 交换器 绑定和权限机制 vhost是AMQP概念的基础 必须在连接时制定 RabbitMQ

默认的vhost是 /

Broker

表示消息队列服务器实体

3.下载与安装 (Linux环境下)

3.1 下载ErLang的rpm包

RabbitMQ是ErLang语言编写的 所以ErLang环境必须要组装好 版本要匹配

#安装erlang
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v22.0.4/erlang-22.0.4-1.el7.x86_64.rpm
#升级软件包  更新:rpm -Uvh
rpm -ivh erlang-22.0.4-1.el7.x86_64.rpm
yum -y install erlang
erl -version

#安装rabbitmq
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-3.7.15-1.el7.noarch.rpm
yum -y install rabbitmq-server-3.7.15-1.el7.noarch.rpm


#后台运行
/usr/sbin/rabbitmq-server -detached
#开机启动
chkconfig rabbitmq-server on

#启动rabbitmq服务
service rabbitmq-server start

#开启管理控制台
/usr/sbin/rabbitmq-plugins list
/usr/sbin/rabbitmq-plugins enable rabbitmq_management

rabbitmqctl add_user  admin  admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl add_vhost admin
rabbitmqctl set_permissions -p admin  admin ".*" ".*" ".*"

#开启远程访问
#cd /etc/rabbitmq  
#cp /usr/share/doc/rabbitmq-server-3.5.6/rabbitmq.config.example /etc/rabbitmq/   
#mv rabbitmq.config.example rabbitmq.config 
#vim /etc/rabbitmq/rabbitmq.config
添加: {loopback_users, []}

#访问
http://ip:15672   guest  guest

4. RabbitMQ 管理页面

5.五种消息类型

  • 简单队列模式 : 最简单的工作队列 其中一个消息生产者 一个消息消费者 一个队列 也被成为点对点模式
  • 工作模式 : 一个消息生产者 一个交换器 一个消息队列 多个消费者 同样也可以被称为 点对点模式
  • 发布订阅模式 : 无限则接收消息 一个消息生产者 一个交换器 多个消息队列 多个消费者
  • 路由模式 : 在发布订阅模式的基础上 有选择的接收消息 也就是通过routing路由进行匹配条件是否满足接收消息
  • 主题模式 : 同样是在发布订阅模式的基础上 根据主题进行筛选是否接收消息
  • RPC模式 : 类模式是拥有请求/回复的 用的很少

5种常见的消息模型

  1. 基本消息模型 传说中的直连
    点对点 不需要路由 消息通过通道进行传送


    image.png
  1. work消息模型
    一个生产者 多个消费者 也被成为广播模式
    没有路由


    image.png
  2. 发布订阅模型 - Fanout

    有交换机
    image.png
  1. 订阅模型 - Direct


    image.png
  2. 订阅模型 - Topic 主题模式


    image.png

通道绑定对应消息队列

channel.queueDeclare("hello",false,false,false,null);
//参数1 : 队列名称 如果队列不存在就自动创建
//参数2 : 用来定义队列特性是否要持久化 true 持久化队列 false 不持久化
//参数3 : exclusive 是否独占队列 true 独占队列 false 不独占
//参数4 ; autoDelete 是否在消费完成后自动删除队列 true 自动删除 false 不删除
//参数5 : 额外附加参数
    
    //消息发布参数
    channel.basicPublish("",null,"hello rabbitMQ".getBytes());
//参数1 : 交换机名称 
//参数2 : 队列名称
//参数3 : 传递消息额外设置
//参数4 : 消息的具体内容

消息的持久化

channel.basicPublish("",null,"hello rabbitMQ".getBytes());
中第三个参数可以设置为MessageProperties.PRESISTENT_TEXT_PLAIN 就可以将消息持久化

Spring AMQP

出现的BUG

could not bind to distribution port 25672 it is in use by another node

一直这样 关闭端口之后还是不行

看了博客 发现 重启服务 就可以了 下面是所用命令

rabbitmq-service.bat stop           //先停止服务
        rabbitmq-service.bat install
rabbitmq-service.bat start           启动服务

完成

你可能感兴趣的:(RabbitMQ学习(一))