前言


简介: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推送消息到消费者,消费者需手动确认。服务端相应消费者的确认,并处理相应(删除该消息还是从新分配。。。。)

示例:发送 https://github.com/374003909/RabbitQM/blob/master/src/main/java/com/example/RabbitQM/ack/AckSender.java

示例:接受 https://github.com/374003909/rabbitqm2/blob/master/src/main/java/com/example/rabbitqm2/direct/XxtzReceiver3.java

六: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)的更多相关文章

  1. php消息队列

    Memcache 一般用于缓存服务.但是很多时候,比如一个消息广播系统,需要一个消息队列.直接从数据库取消息,负载往往不行.如果将整个消息队列用一个key缓存到memcache里面.对于一个很大的消息 ...

  2. 消息队列(MQ)入门-activemq,代码级别

    第一种:activemq: 1.从官网下载apache-activemq-5.15.3-bin.zip并解压: 2.启动activemq, CMD--/bin/activemq start ,访问12 ...

  3. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

  4. 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...

  5. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  6. PHP实现RTX发送消息提醒

    RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...

  7. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  8. 一步步开发自己的博客 .NET版(10、前端对话框和消息框的实现)

    关于前端对话框.消息框的优秀插件多不胜数.造轮子是为了更好的使用轮子,并不是说自己造的轮子肯定好.所以,这个博客系统基本上都是自己实现的,包括日志记录.响应式布局.评论功能等等一些本可以使用插件的.好 ...

  9. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

随机推荐

  1. Linux中的官方源、镜像源汇总

    转载一篇文章,很有用 (一).企业站 搜狐: http://mirrors.sohu.com/ 网易: http://mirrors.163.com/ 阿里云: http://mirrors.aliy ...

  2. go语言实现https的简单get和post请求

    package main import ( "crypto/tls" "fmt" "io" "io/ioutil" &q ...

  3. BP神经网络综合评价法

    BP神经网络综合评价法是一种交互式的评价方法,一种既能避免人为计取权重的不精确性, 又能避免相关系数求解的复杂性,还能对数量较大且指标更多的实例进行综合评价的方法,它可以根据用户期望的输出不断修改指标 ...

  4. java做图片点击文字验证码

    https://blog.csdn.net/qq_27721169/article/details/82769093

  5. Analisis of Hello2 source

    GreetingServlet.java @WebServlet("/greeting") //为servelt指定URL pattern为:/greeting public cl ...

  6. banner | what is the "banner" ?

    banner/横幅   获取 banner(横幅) 信息属于信息搜集   因为在 banner 信息中,可以获取到软件开发商.软件名称.服务类型.版本号等   而版本号有时候就会存在公开的 CVE 问 ...

  7. Windows10用fiddler抓包Android应用(解决手机设置代理后无法上网,设置只抓app包)

    1.环境准备 1.电脑上安装fiddler 2.手机和电脑在同一个局域网内 2.设置 1.fiddler>Tools>Fiddler Options>Connections 勾选Al ...

  8. Cocos2d-js和Android交互

    说白了,就是JavaScript和Java之间的函数互相调用. 先看一下效果 有了这个交互,为了以后接sdk做准备. 要点: javascript调用java: jsb.reflection.call ...

  9. python学习:元组和嵌套

    tuple(元组):只是可读,不可以修改# tup1 = () #空元组# tup2 = (20,) #元组内有一个元素,需要在元素后添加逗号 a = (1,2,3,4)print(a[1])a[1] ...

  10. SpringBoot报错:Invalid bound statement (not found)

    错误原因: 没有发现Mybatis配置文件的路径 解决方法: 检查Mapper包名与xml文件标签的namespace数据名称是否相同 <mapper namespace="com.t ...