项目模拟实现消息队列第一天

简介: 项目模拟实现消息队列第一天

认识消息队列

消息队列称为(Message Queue ,MQ.  在多线程常常会谈到一个阻塞队列(Blocking Queue)->生产者消费者模型

所谓的消息队列,就是把阻塞队列这样的数据结构,单独提取出了一个程序,独立进行部署->生产者消费者模型(进程和进程之间/服务和服务之间)

分布式系统-整个服务器程序,不是一个单一的程序了,而是一组服务器构成的集群。

生产者消费者模型的作用

1.解耦合(写代码的追求 高内聚,低耦合)

本来分布式系统,a服务器调用b服务器(A给B发送请求,B给A返回响应)->A和B耦合比较大,如何解耦合呢? 引入消息队列后,A把请求发给消息队列,B再从消息队列中获取到请求。

2.削峰填谷

A是入口服务器,A再去调用B完成一些具体的业务,如果A和B直接通信,如果A突然收到一组用户请求的峰值,此时B也会感受到峰值->(物理上的服务器,硬件资源都是有上限的(包括但是不限于,CPU,内存,硬盘,网络带宽)

引入消息队列之后,A把请求发送给消息队列,B从队列中获取请求,虽然A收到的请求很多,队列收到的请求也不少,但是B可以按照原有节奏来取需求,不至于一下子收到很多的量。

市面一些知名MQ:

RabbitMQ

Kafka

RocketMQ:阿里的名气小

ActiveMQ:用的更少

MQ的使用暂时不去讨论

我们去关注MQ怎么模拟实现出来

以RabbitMQ为蓝图去了解。

需求分析

1.生产者(Producer)

2.消费者(Comsumer)

3.中间人(Broker)

4.发布(Publish)    生产者向中间人这里投递信息的过程

5.订阅(Subscribe) 哪些消费者要从这个中间人这里取数据,这个注册的过程,称为订阅

(火影忍者充月卡)

6.消费:消费者从中间人这里取数据的动作(领月卡)

服务器很多种含义:

1.7*24小时持续工作的电脑,配置比普通电脑高很多,永远是在机房里面,通过网络进行操作。

2.物理服务器上跑的服务器程序(一个/一种具体的程序)

3.更广义,更抽象的概念(客户端-服务器),主动发起请求的是客户端被动接受的是服务器

BrokerServer内部也涉及到一些关键概念

1.虚拟主机(Virtual Host)类似于Mysql中database,算是一个逻辑上的数据集合

一个Broker Server也可以组织多种不同类别的数据,可以使用Virtual Host做出逻辑上的区分

实际开发中,一个Broker Server可能会同时用来管理多组业务线上的数据,就可以使用VirtualHost做出区分

2.交换机(Exchange)

生产者把消息投递给Broker Server实际上,是先把消息交给了Broker Server上的某个交换机,再由交换机把消息转发对应的队列

交换机,类似于饭店的服务员(转发姐)

3.队列(Queue)

真正用来存储处理消息的实体,后续消费者也是从对应的队列中取数据,一个大的消息队列中,可以存在很多小的队列

4.绑定(Binding)

把交换机和队列之间,建立起关联关系~~

可以把交换机和队列视为类似数据库中多对多的关系。一个交换机,可以对应多个队列,一个队列,也可以被多个交换机对应,在数据库的时候,多对多,会有一个中间表

5.消息

具体来说,可以认为是服务器A给B发的请求(通过MQ转发),就是一个消息,服务器B给A返回的响应也是一个消息,一个消息可以视为一个字符串,消息中具体包含啥样的数据都是程序员自定义的。

消息队列要提供的核心API

1.创建队列(queueDeclare)此处不使用Create这样的术语,而是使用Declare,Create就只是单纯的创建,Declare起到的效果是:不存在则创建,存在则不做事情

2.销毁队列(queueDelete)

3.创建交换机(exchangeDelete)

4.销毁交换机(exchangeDelete)

5.创建绑定(queueBind)

6.解除绑定(queueUnbind)

7.发布消息(basicPublish)

8.订阅消息(basicConsume)

消费消息不搞

(因为:MQ和消费者之间,工作模式有两种

1.Push(推)Broker把收到的数据,主动的发送给订阅的消费者  RabbitMQ只支持推的方式

2.Pull(拉)消费者主动调用Broker的api取数据 Kafka -支持拉

9.确认消息(basicAck) - TCP(通过确认应答)

这个api起到的效果,是可以让消费者显示的告诉broker server,这个消息我已经处理完毕了~,提高整个系统的可靠性~,保证消息处理没有遗漏。

就相当于是已读未回,已读已回这种

交换机类型:

交换机在转发消息的时候,有一套转发的规则的!,提供了几种不同的交换机类型来描述这里不同的转发规则~

RabbitMQ主要实现了四种交换机类型(也是根据AMQF协议定义的,用来描述交换机张什么样子)

1.Direct——直接交换机

生产者发送消息,会指定一个"目标队列"的名字

交换机收到之后,就看看绑定的队列里,有没有匹配的队列~如果有,转发过去(把消息塞进对应的队列中)如果没有,就直接丢弃

2.Fanout——扇出交换机


3.Topic——主题交换机

有两个关键概念

(1)bindingKey.把队列和交换机绑定的时候,指定一个单词(如同一个暗号)

(2)routingKey.生产者发送消息的时候,也指定一个单词

如果当前routingKey和bindingKey能对上,此时就可以把这个消息转发到对应的队列中

4.Header——消息头交换机(应用场景比较少,规则复杂)

持久化:

虚拟主机,交换机,队列,绑定,消息,都需要让BrokerServer组织管理

对于上述这些概念对应的数据,需要存储和管理起来,此时内存和硬盘上都会各自存储一份,以内存为主,硬盘为辅

在内存中存储的原因:

对于MQ来说,能够高效的转发处理数据,是非常关键的指标!因此使用内存来组织上述数据,得到的效率,比放硬盘要高的多

(但是一旦断电之后,内存的内容就会丢失,所以在硬盘上存储的原因,为了防止内存中的数据随着进程重启/主机重启而丢失,硬盘的寿命几年-几十年(也要通通电)

网络通信

其他的服务器(生产者/消费者)通过网络,和咱们的Broker Server进行交互的~

此处设定使用,TCP+自定义的应用层协议(这里的主要工作,就是让客户端可以通过网络,调用broker server提供的编程接口,所以客户端,也需要提供上述方法,只不过服务器版本的上述办法,效果是真正干实事,把管理数据进行调整,而客户端这边,只是进行请求的发送和接受),实现生产者/消费者和BrokerServer之间的交互工作

此处,客户端调用了一个本地的方法,结果这个方法在背后,给服务器发了一系列消息,有福气完成了一系列工作,站在调用者的角度,看到的只是说,当前这个功能已经完成,并不知道这背后的细节,虽然调用的事一个本地方法,实际上像是调用了一个远端服务器的方法一样->(远程过程调用RPC)

客户端除了上面9个和服务器这边对应的方法之外,还需提供一下四种方法

1.创建Connection                    

一个Connection对象,就代表一个TCP连接

2.关闭Connection                    
3.创建Channel                          

通道/信道,一个Connection里面可以包含多个Channel,每个Channel上面传递的数据都是互不相干的。

TCP,建立/断开一个连接,成本还是很高的,因此很多时候,我们不希望频繁的建立断开TCP连接~此处的Channel只是一个逻辑概念,比TCP连接的建立和断开,轻量很多

Connection就像是一个打针的那个管,Channel就像是瓶子,我们只需要换瓶子即可

4.关闭Channel
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6月前
|
消息中间件 Dubbo Java
Spring全家桶 、Dubbo、分布式、消息队列后端必备全套开源项目
基于 Spring Boot 2.X 版本的深度入门教程。 市面上的 Spring Boot 基础入门文章很多,但是深度入门文章却很少。对于很多开发者来说,入门即是其对某个技术栈的最终理解,一方面是开发者“比较懒”,另一方面是文章作者把 Spring Boot 入门写的太浅,又或者不够全面。
|
4月前
|
消息中间件 物联网 API
消息队列 MQ使用问题之如何在物联网项目中搭配使用 MQTT、AMQP 与 RabbitMQ
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 Java 中间件
如何在Java项目中实现高效的消息队列系统
如何在Java项目中实现高效的消息队列系统
|
消息中间件 微服务
微服务轮子项目(31) -消息队列对比参照表
微服务轮子项目(31) -消息队列对比参照表
41 0
|
消息中间件 NoSQL Java
基于springboot+Redis的前后端分离项目之消息队列(六)-【黑马点评】
在这里笔者想给大家分享一下课程内没有的思路,看看有没有小伙伴这么想,比如,我们可以不可以使用异步编排来做,或者说我开启N多线程,N多个线程,一个线程执行查询优惠卷,一个执行判断扣减库存,一个去创建订单等等,然后再统一做返回,这种做法和课程中有哪种好呢?答案是课程中的好,因为如果你采用我刚说的方式,如果访问的人很多,那么线程池中的线程可能一下子就被消耗完了,而且你使用上述方案,最大的特点在于,你觉得时效性会非常重要,但是你想想是吗?并不是,比如我只要确定他能做这件事,然后我后边慢慢做就可以了,我并不需要他一口气做完这件事,所以我们应当采用的是课程中,类似消息队列的方式来完成我们的需求。
|
消息中间件 NoSQL Java
SpringBoot项目:RedisTemplate实现轻量级消息队列
背景 公司项目有个需求, 前端上传excel文件, 后端读取数据、处理数据、返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没人愿意傻等, 由于项目暂未使用ActiveMQ等消息队列中间件, 而redis的lpush和rpop很适合作为一种轻量级的消息队列实现, 所以用它完成此次功能开发
|
消息中间件 SQL 运维
小项目的不甘(基于redis的消息队列)
过往项目涉及到的技术和中间件主要有springboot+mysql+redis等,其中的一个文书的生成环节,涉及到的操作过多(文书生成(从xml->doc->pdf),文书信息入库,模版状态的更改、操作日志记录等等),导致测试在进行压测(50/S,100/S,200/S)的时候,接口执行时间过长🤓,以此进行优化。
【vue】项目使用mqtt消息队列实现推送
简介 近年来随着 Web 前端的快速发展,浏览器新特性层出不穷,越来越多的应用可以在浏览器端或通过浏览器渲染引擎实现,Web 应用的即时通信方式 WebSocket 得到了广泛的应用。 WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。
8155 0
|
4月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。