RabbitQM(消息duilie)
前言
简介:RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
使用场景:
1. 解耦:基于消息的模型,关心的是“通知”,而非“处理”。例如短信、邮件通知、缓存刷新等操作使用消息队列进行通知。
2. 异步提升效率:将不是必须的业务逻辑,异步处理。例如在用户注册系统,我们主要的业务逻辑就是把用户注册的信息进行持久化存储,而对于非主要业务进行异步处理(如消息通知),以提升用户注册响应。
3. 流量削峰:比数据库(mysql)写入速率快,并利用消息确认机制控制流量(并发)。
目录
一:消息中间件模型
二:模型图中的对象和属性
三:RabbitMQ常用命令
四:Spring Boot 之RabbitMQ示例
五:RabbitMQ 消息确认(ack)机制
六:RabbitMQ集群简介
一:消息中间件模型
1.1 一般模型图
1.2 RabbitMQ模型图
二:模型图中的对象和属性
2.1 生产者
顾名思义就是生产消息对象的人
2.2 消费者
就是消费消息的人
2.3 消息队列
存储消息的容器
属性 :
属性1:Name 名字
属性2: Durability #定义该队列在重启后的是否存在
属性3: Auto delete #当为yes时,当连接该队列的所有消费者断开连接时,该队列自动删除。
属性4: Arguments #定义该队列的其它属性,例如该队列可以容纳的最大消息数量,一个消息在该队列的最大存活时间等等。
备注:下面是一个通过客户端java声明的一个消息队列queue对象
Queue [name=xxtz, durable=true, autoDelete=false, exclusive=false, arguments={x-message-ttl=50000}, actualName=xxtz]
2.4 消息
就是消息对象
属性:
属性1:Delivery mode #该消息是否持久化
属性2:Headers #消息的头部
属性3:Properties #消息的其它属性content_type,content_encoding,priority 。。。。。
属性4: body #消息的正文
备注:通过Java声明的消息对象 :(Body:'那个谁: id = 130' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=19, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])
2.5 交换机
即接受生产者传递过来的消息对象,并根据消息对象的属性和绑定的的策略来把消息路由到不同消息队列中。
属性:
属性1:Name
属性2:Type 交换机的类型,共四种,借助web参看
属性3:Durability 持久化该交换机
属性4:Auto delete 当最后一个与该交换机绑定的queue,与之解绑后该交换机自动删除
属性5:Arguments
备注:通过客户端java声明的一个交换机queue对象
Exchange [name=xxtzExchange, type=direct, durable=true, autoDelete=false, internal=false, arguments={}]
备注:四种交换机绑定图
图一:fanout交换机 图二:direct交换机 图三:topic交换机
2.5.1 路由机制:
direct : 根据关键字精确路由到queue中。支持一个queue绑定多个关键字时
fanout: 忽略关键字,只要queue绑定了交换机,发送到该交换机的消息就会被转发到queue中
topic : 当声明绑定关系的时候可以使用匹配符*‘*’ (星号)‘#’(井号)
备注1:'*'(星号)精确匹配一个单词
备注2:'#'(井号)可以匹配多个单词
备注3: 单词之间需用'.'(英文点)分割
header : 交换机绑定queue时,指定多个key=value属性。发送到该交换机中消息,交换机会取消息的头,并匹配绑定时的属性,并路由到匹配中的queue中。
三:RabbitMQ常用命令
3.1 https://www.cnblogs.com/jinliang374003909/p/10773189.html
四:Spring Boot 之RabbitMQ示例
类似Spring与其它服务端的交互方式,如与mysql数据库服务器,Spring封装了一个jdbcTemplate。在于RabbitMQ服务器交互封装了一个AmqpTemplate对象,我们只需调用该对象的相关API即可。
4.1 发送消息步骤
步骤一:声明消息队列Queue
步骤二:声明交换机exchange
步骤三:声明绑定关系()
步骤四:通过调用AmqpTemplate对象api发送消息
4.2 消费消息示例
步骤一:通过@RabbitListener (用于类上)注册消费者(监听者)
步骤二:通过@RabbitHandler(用于方法上) 注册消息者api用于处理监听到的消息。
五:RabbitMQ 消息确认(ack)机制
5.1 Confirm 确认 :即生产者需要确认消息已正确发布到服务器
5.2 Return 消息机制 :即当rabbitMQ服务器无法路由指定消息到任何一个消息队列时(默认删除丢弃该消息),返回该消息给生产者
5.3 消费端 Ack 和 Nack 机制 : RabbitMQ推送消息到消费者,消费者需手动确认。服务端相应消费者的确认,并处理相应(删除该消息还是从新分配。。。。)
六:RabbitMQ集群简介
前提条件
* 唯一的节点名称,并配置在/etc/hosts目录下(可通过 ping wxapp203 测试各节点是否联通)
172.16.50.216 wxapp216
172.16.50.203 wxapp203
172.16.50.211 wxapp211
* 确保各节点下的.erlang.cookie(/var/lib/rabbitmq/.erlang.cookie)值相同,并且确保权限为600 (先修改权限chmod u+w .erlang.cookie)
备注:scp wxapp203:/var/lib/rabbitmq/.erlang.cookie ./ (scp 基于ssh登陆进行安全的远程文件拷贝命令,需要验证密码)
5.1 一般集群
* 关闭当前节点 rabbitmqctl stop_app
* 重置当前节点 rabbitmqctl reset
* 加入集群 rabbitmqctl join_cluster rabbit@wxapp203
备注1:默认是disk节点,我们可以指定参数--ram 创建ram节点 rabbitmqctl join_cluster --ram rabbit@wxapp203:
备注2:建议集群中disk节点的数量为(n/2)+1 个
* 启动当前节点 rabbitmqctl start_app (加入集群)
备注1:查看集群状态 rabbitmqctl cluster_status
备注2:一般模式集群特征,集群通信依赖节点之间的通信,例如有两个节点A,B.
5.2 镜像集群
通过设置集群策略来定制高可用集群
命令:rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
命令解释:
rabbitmqctl rabbitmq的集群管理工具(插件)
set_policy 指定类型,设置策略
ha-all 命名策略名称
"^" 匹配模式,所用匹配(对正则表达式完全支持),
{"ha-mode":"all"} 策略类型all(供三种exactly,all,nodes),即集群中的所用节点都会复制一份queue。
ha-mode 策略对象的必选属性(关键词),
ha-params 可选属性
备注1:如果如果结合java项目定义的策略不生效,可删除所用queue和exchange后重启项目(即重新定义queue和exchange)
备注2:常用策略类型,
exactly {"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}
nodes {"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}
all {"ha-mode":"all"},即实例
备注3:查看镜像集群
方法一:查看UI页面
方法二:rabbitmqctl list_queues name policy pid slave_pids
参考资料
https://www.rabbitmq.com/tutorials/tutorial-six-java.html
https://www.cnblogs.com/ityouknow/p/6120544.html
https://www.zouyesheng.com/rabbitmq.html
https://blog.csdn.net/hellozpc/article/details/81436980
项目地址 :https://github.com/374003909/RabbitQM
四:分配策略
即队列中的消息如何分配给不同消费者,假设这样的场景,一个消息队列中有多条消息,rabbitQM服务器发现了一个消费者,它是一次性的把所有消息分配给该消费者呢?还是该消费者消费了一个消息(假设消费一个消息需要10秒钟)后在分配另一个消息呢?如果先发现一个消费者后又发现一个消费者怎么分配?如果一次发现多个消费者消息又如何分配呢?。。。。。
分配策略一:
分配策略二:
测试Spring Boot默认的分配策略?
场景一:一次性发现两(多)个消费者。
结论:消息队列中的消息平均分配给两个消费者,即一个消费者只消费偶数消息,另一个消费者只消费奇数消息
场景二: 一次性发现两(多)个消费者。在消费时其中一个消费者showdown了,怎么消费?
结论:
场景三:先发现一个消费者后又发现一个消费者,怎么消费?
结论:如果第一个消费者不死,第二个消费者不会消费到消息
分配策略小结:
真对Spring Boot的默认分配策略分析,rabbitqm服务器在分配队列中的消息时,会先查看监控该队列的消费者,然后制定分配策略。分配策略一旦制定如果消费者不出意外,就按这个策略执行。但如果消费者发生意外导致不能正确相应服务器(Message acknowledgment 策略)。先前分配给该消费者的消息会重新被rabbitqm服务器分配(即一种递归策略)
RabbitQM(消息duilie)的更多相关文章
- php消息队列
Memcache 一般用于缓存服务.但是很多时候,比如一个消息广播系统,需要一个消息队列.直接从数据库取消息,负载往往不行.如果将整个消息队列用一个key缓存到memcache里面.对于一个很大的消息 ...
- 消息队列(MQ)入门-activemq,代码级别
第一种:activemq: 1.从官网下载apache-activemq-5.15.3-bin.zip并解压: 2.启动activemq, CMD--/bin/activemq start ,访问12 ...
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- PHP实现RTX发送消息提醒
RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- 一步步开发自己的博客 .NET版(10、前端对话框和消息框的实现)
关于前端对话框.消息框的优秀插件多不胜数.造轮子是为了更好的使用轮子,并不是说自己造的轮子肯定好.所以,这个博客系统基本上都是自己实现的,包括日志记录.响应式布局.评论功能等等一些本可以使用插件的.好 ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
随机推荐
- 【JAVA】HashMap的原理及多线程下死循环的原因
再次翻到以前工作中遇到的一个问题,HashMap在多线程下会出现死循环的问题,以前只是知道会死循环,导致CPU100%把机器拖跨,今天来彻底看看 首先来看下,HashMap的原理:HashMap是一个 ...
- PHP使用urlencode对中文编码时空格、加号的问题
使用urlencode这个函数进行格式化,urlencode函数会把空格编码为为:+ 当然,前端在接收时可以解码后进行替换 + 为空格的方式处理. 但是这样就多做了一步,很麻烦,有的时候我们的数据接口 ...
- [转]CDH QuickStart VM基本使用
https://blog.csdn.net/wiborgite/article/details/78731944 https://www.cnblogs.com/harrychinese/p/big_ ...
- 编写一份好的 Vimrc
编写一份好的 Vimrc 目录 如何 Vimrc 色彩 空白字符与制表符 UI 配置 搜索 折叠 移动 用户自定义的前缀快捷按键 插件CtrlP 启动配置 终端Tmux 自动命令及其分组 备份 自定义 ...
- 分布式缓存技术之Redis_04Redis的应用实战
目录 1 Redis Java客户端的使用 Jedis 单点连接 Jedis sentinel连接哨兵集群 Jedis sentinel源码分析 Jedis Cluster分片环境连接 Jedis C ...
- Codeforces 126B. Password (KMP)
<题目链接> 题目大意:给定一个字符串,从中找出一个前.中.后缀最长公共子串("中"代表着既不是前缀,也不是后缀的部分). 解题分析:本题依然是利用了KMP中next数 ...
- POJ 1966 Cable TV Network (点连通度)【最小割】
<题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见 >>> 本题是求点连通度, ...
- 元素定位-XPATH定位方法总结
1.Xpath定位方法探讨 xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能.如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小. 1.1.什么 ...
- Android的自定义View及View的绘制流程
目标:实现Android中的自定义View,为理清楚Android中的View绘制流程“铺路”. 想法很简单:从一个简单例子着手开始编写自定义View,对ViewGroup.View类中与绘制View ...
- 我的 FPGA 学习历程(13)—— 电子钟项目
在秒表上一些其他模块就可以变成电子钟了,使用以下约定: 使用 KEY[0] 作为复位按键,复位后显示 00:00. 使用 KEY[1] 作为调整/暂停按键,暂停时电子钟调整的两个灯管保持 1Hz 的频 ...