MQ 概念

MQ 概念

同步调用与异步调用

  • 同步调用
    • A服务调用B服务,需要等待B服务执行完毕获取响应后,A服务才可以继续执行
    • 同步调用可以通过REST或RPC完成
    • REST:ribbon、Feign
    • RPC:Dubbo
  • 异步调用
    • A服务调用B服务,不需要等待B服务的执行结果,也就是说B服务在执行的同时,A服务就可以继续执行
    • 异步调用可以通过消息队列实现异步调用

同步调用
image

异步调用
image

什么是MQ

MQ Message Queue 本质上是一个队列, FIFO, 是一种跨进程通信机制, 用于上下游传递消息。 在互联网架构中,MQ是一种非常常见的上下游"逻辑解耦+物理解耦"的消息通信机服务。

使用MQ之后,消息发送上有只需要依赖MQ, 不用依赖其他服务。

为什么要用MQ(作用)

解耦,冗余,扩展性,消峰,可恢复性,顺序保证,缓冲,异步通信

流量消峰

如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时没问题,正常时段下单后1s就可以获得结果。

但是在高峰时段,如果有两万次下单,系统是没有能力处理的,只能限制订单超过1w次后不能下单。

使用消息队列做缓冲就可以取消这个限制,将1s内下单的操作分散到一段时间来做, 这是用户可能在下单一段时间后才能收到结果, 但是比不能下单体验好。

应用解耦

以电商为例,应用中有订单系统、库存系统、物流系统、支付系统。

用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统故障,都会导致下单异常。

当转变为消息队列后,物流系统故障期间,将其要处理的内容缓存在消息队列中, 在系统恢复后再继续处理,可以保证用户下单操作正常完成,用户感受不到物流系统的故障,提高系统的可用性。

异步处理

A 服务调用B服务, B服务需要很长时间处理, 此时A服务获取处理结果一般可以通过轮询或提供回调API,但是它们都不够优雅。

使用消息队列, A服务监听B服务处理完成的消息, 当B处理完成后发一条消息给MQ, MQ将消息转发给A即可。
image

冗余(存储)

通过将消息持久化,在确保数据已经被完全处理后再将消息从消息中间件中删除,可以规避数据丢失风险。

扩展性

消息中间件解耦了应用的处理过程,提高消息入队和处理效率会很容易,只需要增加处理过程即可。

可恢复性

消息中间件降低了应用间的耦合,不会因为一部分应用失效导致整体服务不可用。因为消息中间件中的消息会在处理程序恢复后继续处理中间件中的消息。

顺序保证

消息中间件一般都支持顺序消费消息。

缓冲

任何系统中都都会存在需要不同处理时间的的元素。消息中间件通过一个缓冲层来帮助任务最高效率地执行,写入中间件的处理会经可能快速。缓冲层有助于控制和优化数据流经过系统的的速度。

RabbitMQ 的特点

  • 可靠性 Rabbit 提供了如持久化、传输确认及发布确认等机制来确保可靠性
  • 灵活的路由 RabbitMQ提供了多种内置的交换机,以及支持交换机绑定和插件机制来扩展路由功能
  • 扩展性 可以将多个Rabbit节点组成一个集群,也可根据业务情况动态扩展集群。
  • 高可用性 队列可以在集群中的机器上设置镜像,使得部分节点在出现问题的情况下队列依然可用
  • 多种协议 支持AMQP、STOMP、MQTT等多种消息中间件协议
  • 多语言客户端 几乎支持所有常用语言
  • 管理界面 提供了一个易用的用户界面,可以监控和管理消息、集群中的节点等
  • 插件机制 Rabbit提供了多种插件,以及自定义插件来进行扩展

核心概念

RabbitMQ 是一个消息中间件, 它接受并转发消息。它只负责接收,存储和转发。

核心概念

生产者、消费者、交换机、队列
image

生产者

产生数据发送消息的程序是生产者

交换机

是RMQ最重要的部件, 它接受来自生产者的消息, 并将消息推送到特定的队列中。交换机必须确切知道如何处理它接受到的消息, 例如将消息推送到特定队列或送到多个队列或丢弃消息等。 这由交换机类型决定。

队列

是RabbitdMQ内部使用的一种数据结构,尽管消息流经RabbitMQ和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束, 本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列, 许多消费者可以尝试冲一个队列接收数据。

消费者

最终接收数据并进行处理的程序

交换机、路由键、绑定

  • 交换机

    • RabbitMQ中真正接收消息的实体(没有指定交换机时有一个默认交换机),交换机有多种类型,不同类型有不同的路由策略。
  • RoutingKey

    • 生产者将消息发给交换机时,一般会指定一个RoutingKey,用来指定这个消息的路由规则,而这个RoutingKey需要与交换机类型和BindingKey联合使用才能生效。
    • MSG->routingkey->Excnahge->bindingKey->Queue
  • Binding 绑定

    • RabbitMQ 中通过绑定将交换机与队列关联起来,并在绑定时指定一个key,如此交换机就指定消息如何路由给队列了。

RabbitMQ 模式

image

posted @   Dreamsrj  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示