MQ(message queue)

AMQP协议
AMQP ladvanced message queuing protool)‘在2003年时被提出,最早用于解决金融领不同平台之间的消
息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protoco1(链接协
议),这是其和UNS的本质差别,AMOP不从API层进行限定,而是直接定义网络交换的数据格式。这使
得实现了AMOP的provider天然性就是跨平台的。以下是ANOP协议模型:


rabbitMq安装:(安装版本为3.8.14.1,系统为centOS7)

 进入官网下载rabbitmq-server-3.8.14-1.el7.noarch.rpm和erlang-23.2.1-1.el7.x86_64.rpm官网地址:https://packagecloud.io/rabbitmq利用ftp工具将文件放入linux系统,socat安装:yum install -y updateyum install -y socat启动rabbitMq:systemctl start rabbitmq-server或者rabbitmq-server -detached           //启动rabbitmq,-detached代表后台守护进程方式启动查看rabbitMq状态:rabbitmqctl status查看rabbitmq是否启动:systemctl status rabbitmq-server停止rabbitMq:rabbitmqctl stop列出角色:rabbitmqctl list_users配置 rabbitmq 监控地址: rabbitmq-plugins enable rabbitmq_management关闭防火墙:systemctl stop firewalld.service添加用户:rabbitmqctl add_user admin admin # rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" //添加权限# rabbitmqctl set_user_tags admin administrator  //修改用户角色rabbitmqctl help:查看更多命令
本地访问:虚拟机地址:15672

项目实例:
1.创建项目,引入依赖

<!-- 引入rabbitMq相关依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.2</version></dependency>

第一种模型(直连):

 p:生产者,也就是要发送消息的的程序c:消费者,消息的接受者,会一直等待消息的到来queue:消息队列,类似于一个邮箱,可以缓存消息。生产者网其中投放消息,消费者从中取出消息。

第二种模型(work queue):

 当消息处理比较耗时时,可能生产消息的速度远远大于消费消息的速度,长此以往,
就会造成消息堆积,这种情况下,就可以使用工作队列。让多个消费者绑定到一个队列,共同消费队列中的消息。获取消息方式类似于轮询。

第三种模型(fanout):

 fanout:扇出,也称为广播在广播模式下,消息发送流程是这样的:· 可以有多个消费者· 每个消费者有自己的队列· 每个队列都要绑定到交换机· 生产者发送的消息只能发送到交换机,交换机来决定发送到哪个队列,生产者无法决定· 交换机把消息发送给绑定过的队列· 队列的消费者都能拿到消息,实现一条消息被多个消费者消费

第四种模型(Routing):

Routing之订阅模型-Direct(直连)在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。
在Direct模型下:·队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)·消息的发送方在向Exchange发送消息时,也必须指定消息的RoutingKey 。·Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息流程:Puttina it all toaether

routing之订阅模型-Topic

Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。
只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符! 这种模型
Routingkey一般都是由一个或多个单词组成,多个单词之间以""分割,例如: item.insert

SpringBoot整合rabbitMq使用:
1.创建项目

 创建项目,在导包的时候搜索 spring fot rabbitMq,导入amqp依赖包

2.项目配置(yml文件):

spring:application:name: rabbitmq_springBootrabbitmq:host:   // 虚拟机主机的ipport: 5672               //端口默认5672virtual-host: /ems    //自己创建的虚拟username: admin   //用户名和密码password: admin

第一种模型:hello模型在整合后的使用:

provider:生产者代码public void testHello(){rabbitTemplate.convertAndSend("hello","hello world");}customer:消费者代码@Component@RabbitListener(queuesToDeclare = @Queue("hello")) // 默认名称hello,durable="true",autodelete="false"public class Customer {@RabbitHandlerpublic void receive1(String message){System.out.println("message:"+message);}}

第二种模型:workQueue使用

生产者代码:// work queue@Testpublic void testWork(){for (int i = 0; i < 10; i++) {rabbitTemplate.convertAndSend("work","work message"+i);}}消费者代码:@Componentpublic class WorkCustomer {@RabbitListener(queuesToDeclare = @Queue(value = "work"))public void receive1(String message){System.out.println("message1:"+message);}@RabbitListener(queuesToDeclare = @Queue(value = "work"))public void receive2(String message){System.out.println("message2:"+message);}}

第三种模型:fanout广播

生产者代码:public void testFanout(){rabbitTemplate.convertAndSend("logs","","这是广播模型的消息");}
消费者代码@Componentpublic class FanoutCustomer {@RabbitListener(bindings = {@QueueBinding(value = @Queue, //@Queue代表一个临时队列exchange = @Exchange(value = "logs",type = "fanout"))})public void receive1(String message){System.out.println("message1:"+message);}@RabbitListener(bindings = {@QueueBinding(value = @Queue, //@Queue代表一个临时队列exchange = @Exchange(value = "logs",type = "fanout"))})public void receive2(String message){System.out.println("message2:"+message);}}

第四种模型:Routing之订阅模型-Direct(直连)

生产者代码:public void testRouting(){rabbitTemplate.convertAndSend("directs","error","routingKey message");}
消费者代码:@Componentpublic class DirectCustomer {@RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directs",type = "direct"),key = {"info","error","warn"})})public void receive1(String message){System.out.println("message1:"+message);}@RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directs",type = "direct"),key = {"error"})})public void receive2(String message){System.out.println("message2:"+message);}}

rabbitmq集群
集群架构
–普通集群

默认情况下 :RabitMQ代理操作所需的所有数据/状态都将跨所有节点复制。这方面的一个例外是消息队列,默认情况下,消息队列位于一个节点上,尽管它们可以从所有节点看到和访问核心解决问题:当集群中某一时刻master节点宕机,可以对Quene中信息,进行备份

主从配置:
rabbitmq-server -detached无法启动rabbitMq的,可以参考:
https://blog.51cto.com/13777111/2300898

虚拟机:192.168.1.32 主192.168.1.33 从192.168.1.34 从
1.ip映射vim /etc/hosts  加入192.168.1.32 mq1192.168.1.33 mq2192.168.1.34 mq3修改完成之后将所有虚拟机hosts文件同步 scp /etc/hosts root@mq2:/etc/,断点续传也行
2.机器安装rabbitmq和erlang,如果克隆了安装了这两个的虚拟机(VMware),则可以省略
3.查看cookie是否一致(VMware克隆的机器是一样的,不一样就用scp同步)cat /var/lib/rabbitmq/.erlang.cookie
4.启动rabbitMq,成功访问管理界面rabbitmq-server -detached
5.在node2和node3执行加入集群命令:1.关闭  rabbitmqctl stop_app2.加入集群  rabbitmqctl join_cluster rabbit@mq13.启动服务:rabbitmqctl start_app
6.查看集群状态,任意节点执行:rabbitmqctl cluster_status
7.如果出现如下显示,集群搭建成功:Cluster status of node rabbit@mq3 ...[ {nodes, [ idisc, [ rabbit@mq1 , rabbit@mq2 , rabbit@mq3]}]》.frunning_nodes , [ rabbit@mq1 , rabbit@mq2 , rabbit@mq3 ]}.{cluster_name , <<" rabbit@mq1">>},{partitions, [ ]},{alarms, [ {rabbit@mq1, [ ]},{rabbit@mq2,[] },{rabbit@mq3, []》]}]

镜像集群:
1.镜像架构图

2.配置集群架构

策略说明rabbitmqctl set.policy [-p vhost>] [--priority <priority ] [--apply-to <apply-to>] <names <pattern<definition>-p Vhost:可选参数,针对指定vhost下的queue进行设置Name :policy的名称Pattern : queue的匹配模式(正则表达式)Definition:镜像定义,包括三个部分ha-mode,ha-params,ha-sync-modeha-mode:指明镜像队列的模式,有效值为all/exactly/nodesall:表示在集群中所有的节点上进行镜像exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定ha-params: ha-mode模式需要用到的参数ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manualpriority:可选参数, policy的优先级
1.查看当前策略rabbitmqctl list_policies
2.添加策略rabbitmqctl set_policy ha-all ' ^hello' '{" ha-mode" : "all" , " ha-sync-mode" : " automatic" }'说明:策略正则表达式为“A”表示所有匹配所有队列名称^hello:匹配hello开头队列
3.删除策略rabbitmqctl set_policy ha-all '^hello' ' { " ha-mode " : "all" , " ha-sync-mode " : " automatic" }'

RabbitMQ自学笔记相关推荐

  1. 字节、阿里等大厂的技术如何?看看这些Java程序员的自学笔记

    这份笔记涉及JVM.JAVA集合.JAVA多线程并发.JAVA基础.Spring原理.微服务.Netty与RPC.网络.日志.Kafka.RabbitMQ.Hbase.MongoDB.设计模式.负载均 ...

  2. 字节跳动大佬的Python自学笔记.pdf

    1. 字节跳动大佬的Python自学笔记 这是我的一个朋友自学资料包,通过这个资料包自学拿到了字节跳动的Offer, 下面是他之前入门学习Python时候的学习资料,非常全面,从Python基础.到w ...

  3. JAVA自学笔记07

    JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...

  4. MySQL自学笔记2--select的5个子句

    MySQL自学笔记 使用的MySQL自带命令客户端,其中具体的操作是在自建的数据库下room303表中进行的,表中的列有:id.name.age.email.tel.salary.riqi.class ...

  5. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  6. JAVA自学笔记24

    JAVA自学笔记24 1.能使用同步代码块就使用同步代码块,除非锁对象是this,就可以考虑使用同步方法.静态方法的锁是类的字节码对象. 2.JDK5新特性 1)接口Lock void Lock()/ ...

  7. 怎么用vc采集ni卡数据_SystemLink自学笔记(6):SystemLink架构和数据服务

    1. SystemLink架构和数据服务 1.1. 架构和特点 现在在对SystemLink的功能有了一个大概的了解后,可以进一步从它的整体架构学习这门新技术了.NI官网给出了白皮书,原文是英文资料, ...

  8. JAVA自学笔记22

    JAVA自学笔记22 1.操作基本数据类型的流 DataInputStream DataOutputStream 数据输出流允许应用程序以适当方式将基本的Java数据类型写入输出流中.然后,应用程序可 ...

  9. 深入理解弹性盒布局(fiex-box)——Web前端系列自学笔记

    文章目录 弹性盒布局 弹性盒布局概述 弹性盒布局属性 display flex-flow justify-content align-items order flex align-self 总结 弹性 ...

最新文章

  1. C++之Boost使用
  2. Doctype作用? 严格模式与混杂模式如何区分?它们有何意义
  3. python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
  4. 名校生都去哪些互联网公司?
  5. PHP如何解决网站大流量与高并发
  6. sqlserver 性能计数器的问题
  7. java n*n矩阵求值及求逆矩阵
  8. springcloud-知识点总结(三):Hystrix Dashboard turbine Zuul SpringCloud Config
  9. 封装jxl导出不同数据类型的excel
  10. 程序员应当注意的肢体语言
  11. 编程猫编程平台的使用介绍
  12. 摄影测量(一):概述
  13. Markdown中的二级标题去掉默认的下划线
  14. 一个VC编写的虚拟桌面软件
  15. qs计算机圣安排名,圣安德鲁斯大学世界排名及专业排名汇总(QS世界大学排名版)...
  16. 车金融|金融产品规则引擎的前世今生(下篇)
  17. 谷歌身份验证器 java demo实现 及使用中问题分析
  18. 2022钉钉发布会|云钉低代码新模式、新能力、新机遇
  19. 解决WINDOWS邮箱无法收取QQ邮件
  20. python 百度云不限速_百度云不限速插件内置十几种网盘搜索!

热门文章

  1. Google Breakpad 在 windows下捕获程序崩溃报告
  2. MSP432 快速开发指南:如何利用 DriverLib 进行快速开发
  3. 基于GAN的图像生成模型
  4. 【数据挖掘】 基于二手车交易价格预测-赛题分析
  5. python导入pyx文件失败
  6. React Router 4 简易入门
  7. js 拖拽上传文件夹
  8. 树莓派VNC复制粘贴
  9. java引用类型用法的总结
  10. 昆明视频监控建设行之有效 明年底实现百分百覆盖