MQ学习笔记--(RabbitMQ)

这篇具有很好参考价值的文章主要介绍了MQ学习笔记--(RabbitMQ)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录:

  • 初识MQ
  • RabbitMQ快速入门
  • SpringAMQP

初始MQ:

  • 同步通讯
  • 异步通讯
  • MQ常见框架

初始MQ–同步通讯的优缺点

同步通讯和异步通讯

同步通讯:比如微信视频,同一时间只能跟一个人视频,其他人想跟你视频的话,得等你这个视频结束之后才可以

异步通信:比如微信发消息,发了一个人后,别人可能还没回你,但你还可以给其他人发

同步调用的问题

微服务间基于Feign的调用就属于同步方法,存在一些问题。

1.耦合度高

  • 每次加入新的需求,都要修改原来的代码

2.性能下降

  • 调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和。

3.资源浪费

  • 调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源

4.级联失败

  • 如果服务提供者出现问题,所有调用方都会跟着出问题,如同多米诺排骨一样,迅速导致整个微服务群故障。

总结

同步调用的优点:

  • 时效性较强,可以立即得到结果

同步调用的问题:

  • 耦合度高
  • 性能和吞吐能力下降
  • 有额外的资源消耗
  • 有级联失败问题

初始MQ–异步通讯的优缺点

异步调用常见实现就是事件驱动模式

事件驱动优势

优势一:服务解耦
优势二:性能提升,吞吐量提高
优势三:服务没有强依赖,不担心级联失败问题
优势四:流量削峰

小结

异步通信的优点

  • 耦合度低
  • 吞吐量提升
  • 故障隔离
  • 流量削峰

异步通信的缺点:

  • 依赖于Broken的可靠性、安全性、吞吐能力
  • 架构复杂了,业务没有明显的流程线,不好追踪管理


初始MQ–mq常见技术介绍

什么是MQ

MQ,中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

RabbitMQ ActiveMQ RocketMQ Kafka
公司/社区 Rabiit Apache 阿里 Apache
开发语言 Erlang Java Java Scala&Java
协议支持 AMQP,XMPP,SMTP,STOMP OpenWrite,STOMP,REST,XMPP,AMQP 自定义协议 自定义协议
可用性 一般
单机吞吐量 一般 非常高
消息延迟区 微秒级 毫秒级 毫秒级 毫秒以内
消息可靠性 一般 一般

kafka适用于海量数据的传输,但对数据安全要求不高的,比如说日志数据

中小型企业推荐使用 RabbitMQ

如果是大型企业,需要做更深度的定制,推荐使用RocketMQ



RabbitMQ快速入门–介绍何安装

RabbitMQ概述

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:http://www.rabbitmq.com/

RabbitMQ部署指南

1.单机部署

在Centos7虚拟机中使用Docker来安装

1.1下载镜像

方式一:在线拉取

docker pull rabbitmq:3-management

方式一:从本地加载

从资料中提供的镜相包上传到虚拟机后,使用命令加载镜像即可:

docker load -i mq.tar
1.2安装MQ

执行下面的命令来运行MQ容器

docker run \
  -e RABBITMQ_DEFAULT_USR=luxifa \     #设置环境变量
  -e RABBITMQ_DEFAULT_PASSWORD=1234 \  #设置环境变量
  --name mq \                          #起名
  --hostname mql \                     #配置主机名,不配也没关系,如果将来做集群部署的话,就得配
  --p 15672:15672 \                    # 开放了两个端口 15672是rabbitmq 管理平台的端口
  --p 5672:5672 \                      # 做消息通信的端口
  -d \                                 # 后台运行
  rabbitmq:3-management                # 镜像的名称

把命令在控制台运行,容器即可创建完成
通过 docker ps 查看一下

在浏览器输入:http://机器IP:15672 即可进入RabblitMQ的管理界面

界面中:
Overview:总览,主要就是节点的一些详细信息,因为现在是单节点运行,没有集群,所以节点中只有一个
Connections:连接,将来,无论是消息的发布者还是消息的消费者,都要跟mq建立连接
Channels:通道,建立连接以后一定要建立通道,生产者或消费者才能基于channels完成消息的发送或接收,可以认为channe是mq中消息发送也好,接收也好等等各种操作的一个对象,将来每一个连上的人都应该创建一个或多个channel

Exchanges:交换机
Queues:队列,用来做消息存储的
Admin:管理,在这个界面中可以管理当前的用户信息


RabbitMQ的结构和概念

发布者会将消息发送到exchange,exchange负责路由,把消息投递到queue,queue负责暂存消息,消费者从queue中获取消息,处理消息

小结

RabbitMQ中的几个概念:

  • channel:操作MQ的工具
  • exchange:路由消息到队列中
  • queue:缓存消息
  • virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组


RabbitMQ快速入门–消息模型介绍

常见消息模型

MQ的官方文档中(http://rabbitmq.com/getstarted.html)给出了5个MQ的Demo示例,对应了几种不同的用放大:

  • 基本消息队列(BasicQueue)
  • 工作消息队列(WorkQueue)

这两种都是基于消息队列来完成的,没有经过交换机

发布订阅(Publish、Subscribe),又根据交换机类型不同分为三种:

  • Fanout Exchange:广播
  • Direct Exchange:路由
  • Topic Exchange:主题

HelloWorld案例

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

  • publicsher:消息发布者,将消息发送到队列queue
  • queue:消息队列,负责接受并缓存消息
  • consumer:订阅队列,处理队列中的消息

案例:完成官方Demo中的hello world 案例

实现步骤:

  • 导入资料中的demo工程
  • 运行publisher服务中的测试类PublisherTest中的测试方法testSendMessage()
  • 查看RabibitMQ控制台的消息
  • 启动consumer服务,查看是否能接收消息

PublisherTest.java

public class PublisherTest {
	@Test
	public void testSendMessage() throws IOException, TimeoutException {
		// 1.建立连接
		ConnectionFactory factory = new ConnectionFactory();
		// 1.1设置连接参数 分别是:主机名、端口号、vhost、用户名、密码
       factory.setHost("192.168.150.101");
       factory.setPort(5672);
       factory.setVirtualHost("/");
       factory.setUsername("luxifa");
       factory.setPassword("123456");
       // 1.2建立连接
       Connection connection = factory.newConnection();

	   // 2.创建通道Channel
	   Channel channel = connection.createChannel();

	   // 3.创建队列
	   String queueName = "simple.queue";
	   channel.queueDeclare(queueName,durable:false,exclusive:false,qutoDelete:false,arguments:null);

	  // 4.发送消息
	  String message = "hello rabbitmq!";
	  channel.basicPublish(exchange:"",queueName,props:null,message.getBytes());
	  System.out.println("发送消息成功:【" + message + "】");
	    
	  //5.关闭通道和连接
	  channel.close();
	  connection.close();		
   }
}

ConsumerTest.java

public class ConsumerTest{
	@Test
	public static void main(Strign[] args) throws IOException,TimeoutException {
		// 1.建立连接
		ConnectionFactory factory = new ConnectionFactory();
		// 1.1设置连接参数 分别是:主机名、端口号、vhost、用户名、密码
       factory.setHost("192.168.150.101");
       factory.setPort(5672);
       factory.setVirtualHost("/");
       factory.setUsername("luxifa");
       factory.setPassword("123456");
       // 1.2建立连接
       Connection connection = factory.newConnection();

	   // 2.创建通道Channel
	   Channel channel = connection.createChannel();

	   // 3.创建队列
	   String queueName = "simple.queue";
	   channel.queueDeclare(queueName,durable:false,exclusive:false,qutoDelete:false,arguments:null);

	  // 4.订阅消息
	   channel.basicConsume(queueName,autoAck:true,new DefaultConsumer(channel) {
	   	@Ovrride
	   	public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {
	   		// 5.处理消息
	   		String message = new String(body);
	   		System.out.println("接收到消息:【" + message + "】");
	   	}
	  });
	  System.out.println("等待接收消息......");
   }
}

小结:

基本消息队列的消息发送流程:
1.建议connection
2.创建channel
3.利用channer声明队列
4.利用channel向队列发送消息

基本消息队列的消息接收流程:
1.建议connection
2.创建channel
3.利用channer声明队列
4.定义consumer的消费行为handleDelevery()
5.利用channel将消费者与队列绑定
文章来源地址https://www.toymoban.com/news/detail-474506.html

到了这里,关于MQ学习笔记--(RabbitMQ)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FlinkSQL学习笔记(一)快速入门

    本篇作为FlinkSQL的起始篇,主要介绍了FlinkSQL在使用的概述,通过本篇,可以快速上手。需要注意的一点是:FlinkSQL中的表是动态表,这是其特性之一。 FlinkSQL是架构于 flink core 之上用 sql 语义方便快捷地进行结构化数据处理的上层库;(非常类似 sparksql 和 sparkcore 的关系) 整

    2024年02月20日
    浏览(34)
  • SpringCloud学习笔记(一)_快速入门

    Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环

    2024年02月11日
    浏览(49)
  • Golang快速入门到实践学习笔记

    Go程序设计的一些规则 Go之所以会那么简洁,是因为它有一些默认的行为: 大写字母开头的变量是可导出的,也就是其它包可以读取 的,是公用变量;小写字母开头的就是不可导出的,是私有变量。 大写字母开头的函数也是一样,相当于class 中的带public的公有函数;

    2024年02月20日
    浏览(55)
  • 【ECharts+Vue】学习笔记(快速入门版)

    ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。提供了丰富的可视化图标,帮助你轻松实现大屏展示。 官网地址:Apache ECharts 直接下载 下载官网: https://echarts.apache.org/zh/download.html 如果不挑版本的话,菜鸟教程提供了4.7.0版本地址ECharts 安

    2023年04月21日
    浏览(29)
  • OpenCV4 快速入门 (学习笔记 全)

    作者博客https://blog.csdn.net/shuiyixin?type=blog https://blog.csdn.net/shuiyixin/article/details/106046827 1.1.1 Mat类 https://blog.csdn.net/shuiyixin/article/details/106014341 1.1.2 Rect_结构 https://blog.csdn.net/shuiyixin/article/details/106085233 1.1.3 Scalar_结构 Scalar其实是一个从Vec派生得到的四元向量的模板类 一般情况,我

    2024年02月07日
    浏览(48)
  • PyTorch深度学习快速入门教程【小土堆】 学习笔记

    PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】 anaconda 卸载环境 :conda uninstall -n yyy --all anaconda 安装路径:D:anaconda3 创建环境: conda create -n pytorch python=3.9 切换环境 : conda activate pytorch 查看目前已经安装的工具包:pip list Q 安装pytorch? 进入pytorch首页 下拉,http

    2024年02月07日
    浏览(56)
  • 【Redis学习笔记01】快速入门(含安装教程)

    先来看门见山的给出 Redis 的概念: Redis:是一种基于内存的高性能K-V键值型NoSQL数据库 Redis官网:https://redis.io/ 1.1 初识NoSQL 想必大家都对关系型数据库更为熟悉!如MySQL、Oracle、SQL Server都是比较常见的关系型数据库,所谓关系型数据库主要以二维表作为数据结构进行存储,但

    2024年01月22日
    浏览(46)
  • 黑马程序员Docker快速入门到项目部署(学习笔记)

    目录 一、Docker简介 二、安装Docker 2.1、卸载旧版 2.2、配置Docker的yum库 2.3、安装Docker 2.4、启动和校验 2.5、配置镜像加速 2.5.1、注册阿里云账号 2.5.2、开通镜像服务 2.5.3、配置镜像加速 三、快速入门 3.1、部署MYSQL 3.2、命令解读 四、Docker基础 4.1、常见命令 4.1.1、命令介绍 4.1

    2024年01月25日
    浏览(50)
  • Go语言学习笔记:GORM 介绍及快速入门,简单查询

    GORM 是一个用 GoLang 语言编写的 ORM(对象关系映射)库。它被设计为开发者友好的方式来进行数据库操作。GORM 提供了一种高级的 API 来处理数据库的 CRUD(创建、读取、更新、删除)操作,它支持主流的关系型数据库,如 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server。 GORM 指南 使

    2024年01月21日
    浏览(76)
  • 初识SpringMVC -- SpringMVC快速入门保姆级教程(一)

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码可以在我主页的资源里找到,如果在学习的

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包