网站的推广平台,免费的个人简历模板在哪找,爬虫 网站开发实例,网上注册公司官网流程消息队列 - RabbitMQ 1. 初识 MQ1.1 同步调用1.2 异步调用1.3.技术选型 2. RabbitMQ2.1 安装2.2 收发信息2.2.1 交换机(Exchange)2.2.2 队列2.2.3 绑定关系2.2.4 发送消息 2.3 数据隔离 1. 初识 MQ
微服务一旦拆分#xff0c;必然涉及到服务之间的相互调用#xff0c;之前讲… 消息队列 - RabbitMQ 1. 初识 MQ1.1 同步调用1.2 异步调用1.3.技术选型 2. RabbitMQ2.1 安装2.2 收发信息2.2.1 交换机(Exchange)2.2.2 队列2.2.3 绑定关系2.2.4 发送消息 2.3 数据隔离 1. 初识 MQ
微服务一旦拆分必然涉及到服务之间的相互调用之前讲到的基于 OpenFeign 的调用。这种调用中调用者发起请求后需要等待服务提供者执行业务返回结果后才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态因此我们称这种调用方式为同步调用也可以叫同步通讯。但在很多场景下我们可能需要采用异步通讯的方式为什么呢
两种方式的区别
同步通讯就如同打视频电话双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。异步通讯就如同发微信聊天双方的交互不是实时的你不需要立刻给对方回应。因此你可以多线操作同时跟多人聊天。
两种方式各有优劣打电话可以立即得到响应但是你却不能跟多个人同时通话。发微信可以同时与多个人收发微信但是往往响应会有延迟。
所以如果我们的业务需要实时得到服务提供方的响应则应该选择同步通讯同步调用。而如果我们追求更高的效率并且不需要实时响应则应该选择异步通讯异步调用。
1.1 同步调用
我们以注册成功后邮件通知为例 同步调用的业务流程是
发送注册请求注册成功将信息存入数据库发送邮件通知返回成功信息
这样的业务流程会存在下面三个问题
一、性能低
由于同步调用调用者需要等待服务提供者执行完返回结果后才能继续向下执行也就是说每次远程调用调用者都是阻塞等待状态。最终整个业务的响应时长就是每次远程调用的执行时长之和10010030050 550ms
二、扩展性差
比如需要添加短信通知需要在代码中添加短信服务的远程调用代码。
三、级联失效
在这个案例中注册成功了但是邮件通知服务出现了问题抛出了错误会让存入数据库的信息回滚导致整个注册业务失败。
需要解决这些问题就需要用异步调用的方式来代替同步调用。
1.2 异步调用
异步调用方式其实就是基于消息通知的方式一般包含三个角色
消息发送者投递消息的人就是原来的调用方消息Broker管理、暂存、转发消息你可以把它理解成微信服务器消息接收者接收和处理消息的人就是原来的服务提供方 在异步调用中发送者不再直接同步调用接收者的业务接口而是发送一条消息投递给消息Broker。然后接收者根据自己的需求从消息Broker那里订阅消息。每当发送方发送消息后接受者都能获取消息并处理。 这样发送消息的人和接收消息的人就完全解耦了。
还是以注册通知为例 将远程调用逻辑删除改为发送一条消息到Broker。而相关的微服务都可以订阅消息通知一旦消息到达Broker则会分发给每一个订阅了的微服务处理各自的业务。
后续需要添加短信通知也只需要添加一个短信服务订阅消息即可。
而且注册服务的耗时也和其他服务无关。
综上异步调用的优势包括
耦合度更低性能更好业务拓展性强故障隔离避免级联失败
当然异步通信也并非完美无缺它存在下列缺点
完全依赖于Broker的可靠性、安全性和性能架构复杂后期维护和调试麻烦
1.3.技术选型
消息Broker目前常见的实现方案就是消息队列MessageQueue简称为MQ. 目比较常见的MQ实现
ActiveMQRabbitMQRocketMQKafka
几种常见MQ的对比
RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScalaJava协议支持AMQPXMPPSMTPSTOMPOpenWire,STOMPREST,XMPP,AMQP自定义协议自定义协议可用性高一般高高单机吞吐量一般差高非常高消息延迟微秒级毫秒级毫秒级毫秒以内消息可靠性高一般高一般
追求可用性Kafka、 RocketMQ 、RabbitMQ 追求可靠性RabbitMQ、RocketMQ 追求吞吐能力RocketMQ、Kafka 追求消息低延迟RabbitMQ、Kafka
2. RabbitMQ
RabbitMQ 是一个开源的消息中间件Message Broker用于在分布式系统中传递消息。它实现了高级消息队列协议AMQP这是一种网络协议用于在应用程序之间传递消息。
以下是 RabbitMQ 的一些主要特性和概念
消息队列 RabbitMQ 提供了一个消息队列允许不同的应用程序通过消息进行通信。发送方将消息放入队列而接收方则从队列中获取消息。发布/订阅模型 RabbitMQ 支持发布/订阅模型其中一个应用程序发布者发布消息而多个应用程序订阅者可以订阅并接收这些消息。可靠性 RabbitMQ 提供了持久性确保即使在代理重新启动后队列和消息也不会丢失。灵活的路由 RabbitMQ 具有灵活的路由机制可以根据不同的条件将消息路由到不同的队列。多协议支持 RabbitMQ 支持多种消息传递协议包括 AMQP、STOMP、MQTT 等。插件系统 RabbitMQ 具有丰富的插件系统可以通过插件扩展其功能如集群、身份验证、可视化工具等。可视化管理界面 RabbitMQ 提供了一个易于使用的管理界面允许用户监视和管理队列、交换机等组件。集群支持 RabbitMQ 支持构建集群以提高可用性和性能。消息确认 客户端可以向 RabbitMQ 确认已成功处理消息确保消息不会因为消费者故障而丢失。死信队列 RabbitMQ 支持死信队列用于处理无法被消费的消息。
2.1 安装
这里介绍 Docker 安装 RabbitMQ 的过程。
2.1.1 拉取镜像
docker pull rabbitmq:management # 拉取带有web界面的镜像2.1.2 启动容器
docker run -e RABBITMQ_DEFAULT_USERroot -e RABBITMQ_DEFAULT_PASSroot --name mq --hostname q -p 15672:15672 -p 5672:5672 -d rabbitmq:management
# -e RABBITMQ_DEFAULT_USERroot 用户名
# -e RABBITMQ_DEFAULT_PASSroot 密码端口介绍
4369/tcp: Erlang Port Mapper Daemon (EPMD)端口用于Erlang节点之间的通信。5671/tcp: AMQP over TLS/SSL端口用于安全的AMQP连接。5672/tcp: 默认的AMQP端口用于客户端连接和消息传递。15671/tcp: RabbitMQ Management插件的安全AMQP端口。25672/tcp: 集群端口用于Erlang分布式节点之间的内部通信。15672/tcp: RabbitMQ Management插件的Web管理界面端口通过Web界面进行RabbitMQ的管理。 2.1.3 访问管理页面
http://ip地址:15672 RabbitMQ对应的架构如图 其中包含几个角色
publisher生产者也就是发送消息的一方consumer消费者也就是消费消息的一方queue队列存储消息。生产者投递的消息会暂存在消息队列中等待消费者处理exchange交换机负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。virtual host虚拟主机起到数据隔离的作用。每个虚拟主机相互独立有各自的exchange、queue
2.2 收发信息
2.2.1 交换机(Exchange)
打开Exchanges选项可以看到RabbitMQ预定义了7种交换机这7种交换机有4种类型。
关于交换机类型的简介 Direct Exchange直连交换机: 直连交换机是最简单的交换机类型。 它将消息路由到与消息中的路由键完全匹配的队列中。 在消息生产者指定的路由键和队列的绑定键完全相同时消息将被发送到相应的队列。 Fanout Exchange扇出交换机: 扇出交换机将消息广播到与交换机绑定的所有队列忽略路由键。适用于广播消息给多个消费者的场景不关心消息的具体内容。 Topic Exchange主题交换机: 主题交换机通过匹配路由键和模式的方式来路由消息到队列。路由键可以包含通配符 *匹配一个单词和 #匹配零个或多个单词允许更复杂的路由规则。 Headers Exchange头交换机: 头交换机使用消息的头部信息而不是路由键来决定如何路由消息。在绑定队列时指定一组键值对headers只有当消息的头部信息与这些键值对完全匹配时消息才会被路由到队列。
关于预定义的7种交换机简介
AMQP default: 这是一个直连交换机是 RabbitMQ 的默认交换机。当消息的路由键与队列的绑定键完全匹配时消息将被发送到相应的队列。 amq.direct: 也是一个直连交换机。类似于 AMQP 默认交换机将消息路由到与消息中的路由键完全匹配的队列。 amq.fanout: 是一个扇出交换机。将消息广播到与交换机绑定的所有队列忽略路由键。 amq.headers: 是一个头交换机。使用消息的头部信息而不是路由键来决定如何路由消息。在绑定队列时指定一组键值对headers。 amq.match: 是一个主题交换机。通过匹配路由键和模式的方式来路由消息到队列。支持更复杂的路由规则。 amq.rabbitmq.trace: 这是一个专用于消息追踪的交换机。用于在 RabbitMQ 中追踪消息的流动通常不用于常规消息传递。 amq.topic: 也是一个主题交换机。通过匹配路由键和模式的方式来路由消息到队列。类似于 amq.match支持更复杂的路由规则。
2.2.2 队列
打开Queues选项卡新建一个队列 2.2.3 绑定关系
点击 amq.fanout 交换机 绑定队列 queue1 2.2.4 发送消息
点击 amq.fanout 交换机 发送消息 队列成功收到消息 2.3 数据隔离
RabbitMQ 使用 virtual host 实现数据隔离
新建一个虚拟主机 添加一个用户 现在用户test还没有能访问的虚拟主机 切换登录用户test后无法获取没有访问权限的虚拟主机的队列消息。 点击test为用户添加虚拟主机 右上角 虚拟主机切换为 /test 看不到其他虚拟主机的消息队列这就是基于virtual host 的隔离效果。