MQ第一章

目录

1、什么是消息队列?为什么要使用消息队列

什么是消息队列

为什么要使用消息队列

解耦

异步

削峰

2、常见的消息队列有哪些?它们之间的对比

3、使用消息队列有什么优点?有什么缺点?

优点

缺点

4、RabbitMQ中的AMQP是什么?

AMQP

客户端与RabbitMQ的通讯

连接

信道

虚拟主机

交换器类型

Direct

Fanout

Topic


1、什么是消息队列?为什么要使用消息队列

什么是消息队列

消息队列是一种异步的通信方式,用于在分布式系统中管理消息传递。消息队列采用了生产者-消费者模型,生产者将消息发送到队列中,而消费者则从队列中接收消息。

为什么要使用消息队列

其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么?

面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用MQ可能会很麻烦,但是你现在用了MQ之后带给了你很多的好处。消息队列的常见使用场景,其实场景有很多,但是比较核心的有3个:解耦、异步、削峰。

解耦

A系统发送个数据到BCD三个系统,接口调用发送,那如果E系统也要这个数据呢?那如果C系统现在不需要了呢?现在A系统又要发送第二种数据了呢?而且A系统要时时刻刻考虑BCDE四个系统如果挂了咋办?要不要重发?我要不要把消息存起来?

你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用MQ给他异步化解耦,也是可以的,你就需要去考虑在你的项目里,是不是可以运用这个MQ去进行系统的解耦。

异步

A系统接收一个请求,需要在自己本地写库,还需要在BCD三个系统写库,自己本地写库要30ms,BCD三个系统分别写库要300ms、450ms、200ms。最终请求总延时是30 + 300 + 450 + 200 = 980ms,接近1s。

异步后,BCD三个系统分别写库的时间,A系统就不再考虑了。

削峰

每天0点到16点,A系统风平浪静,每秒并发请求数量就100个。结果每次一到16点~23点,每秒并发请求数量突然会暴增到1万条。但是系统最大的处理能力就只能是每秒钟处理1000个请求啊。怎么办?需要我们进行流量的削峰,让系统可以平缓的处理突增的请求。

2、常见的消息队列有哪些?它们之间的对比

RabbitMQ:

RabbitMQ是一个开源消息队列系统,使用Erlang语言开发,支持多种消息协议和许多语言的客户端。

采用 AMQP 协议,支持多种消息传递模式,支持非常灵活的路由和队列绑定,并且具有高可靠性和高可用性。

Kafka

Kafka是一个高吞吐量、分布式的消息队列系统,基于Scala语言开发,设计用于处理大量数据和实时数据流。

RocketMQ

RocketMQ是一个分布式的消息队列系统,由阿里巴巴公司开发,基于Java语言,支持大规模数据处理和高可用性。

imagepng

3、使用消息队列有什么优点?有什么缺点?

优点

  • 解耦:消息队列可以将应用程序之间的耦合度降低。当一个应用程序将消息写入队列时,它并不需要知道消息将被哪个应用程序处理,只需要知道消息被处理了。
  • 异步:消息队列可以提供异步处理的能力,使得一些不需要实时处理的操作可以在后台处理。
  • 可靠性和扩展性:消息队列系统可以保证消息传递的可靠性,避免消息丢失或重复。同时,它们也支持扩展性,可以应对大量消息和用户的需求。
  • 解决高并发:消息队列可以在高并发的环境中使用,通过分流来保证系统的稳定性。

缺点

  1. 配置复杂:消息队列系统一般需要进行配置和调优,可以将更多的开销放在了部署和设置上。
  2. 稳定性:消息队列的稳定性可能受到网络延迟、高负载等因素的影响,需要进行监控和调整。
  3. 一致性问题 A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,你这数据就不一致了。所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉。

总之,使用消息队列可以提高应用程序之间的解耦、异步处理能力、可靠性和扩展性,但是需要花费时间和精力进行配置和维护。

4、RabbitMQ中的AMQP是什么?

AMQP

是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。主要实现有 RabbitMQ。

imagepng

客户端与RabbitMQ的通讯

连接

首先作为客户端(无论是生产者还是消费者),你如果要与RabbitMQ通讯的话,你们之间必须创建一条TCP连接,当然同时建立连接后,客户端还必须发送一条“问候语”让彼此知道我们都是符合AMQP的语言的,比如你跟别人打招呼一般会说“你好!”,你跟国外的美女一般会说“hello!”一样。你们确认好“语言”之后,就相当于客户端和RabbitMQ通过“认证”了。你们之间可以创建一条AMQP的信道。

信道

概念:信道是生产者/消费者与RabbitMQ通信的渠道。信道是建立在TCP连接上的虚拟连接,什么意思呢?就是说rabbitmq在一条TCP上建立成百上千个信道来达到多个线程处理,这个TCP被多个线程共享,每个线程对应一个信道,信道在RabbitMQ都有唯一的ID ,保证了信道私有性,对应上唯一的线程使用。

疑问:为什么不建立多个TCP连接呢?原因是rabbit保证性能,系统为每个线程开辟一个TCP是非常消耗性能,每秒成百上千的建立销毁TCP会严重消耗系统。所以rabbitmq选择建立多个信道(建立在tcp的虚拟连接)连接到rabbit上。

从技术上讲,这被称之为“多路复用”,对于执行多个任务的多线程或者异步应用程序来说,它非常有用。

虚拟主机

虚拟消息服务器,vhost,本质上就是一个mini版的mq服务器,有自己的队列、交换器和绑定,最重要的,自己的权限机制。Vhost提供了逻辑上的分离,可以将众多客户端进行区分,又可以避免队列和交换器的命名冲突。Vhost必须在连接时指定,rabbitmq包含缺省vhost:“/”,通过缺省用户和口令guest进行访问。

rabbitmq里创建用户,必须要被指派给至少一个vhost,并且只能访问被指派内的队列、交换器和绑定。Vhost必须通过rabbitmq的管理控制工具创建。

交换器类型

共有四种direct,fanout,topic,headers,其种headers(几乎和direct一样)不实用,可以忽略。

Direct

路由键完全匹配,消息被投递到对应的队列, direct交换器是默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由键:channel->basic_public($msg,’’,’queue-name’)

imagepng

Fanout

消息广播到绑定的队列,不管队列绑定了什么路由键,消息经过交换器,每个队列都有一份。

imagepng

Topic

通过使用“”和“#”通配符进行处理,使来自不同源头的消息到达同一个队列,”.”将路由键分为了几个标识符,“”匹配1个,“#”匹配一个或多个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油头老宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值