消息中间件学习笔记——rabbitmq

虾米吃小鱼12138 虾米吃小鱼12138     2022-12-16     439

关键词:


一、消息中间件概述

  通过下图我们就可以很好理解消息中间件的概念。

二、消息中间件(MQ)的优劣

(1).MQ的优势

  1. 应用解耦

  2. 任务异步处理

  3. 削峰填谷

(2).MQ的劣势

系统可用性降低

  系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。如何保证MQ的高可用?
  我们可以建立MQ的集群来提高MQ的高可用。

系统复杂度提高

  MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
  一旦消费者处理完请求会向MQ传递一个ack(类似心跳),以此来保证消息没有被重复消费。MQ以队列形式进行消息传输,以此来保证消息传递的顺序性。至于如何处理信息丢失的情况,我们以rabbitMQ为例,分为以下三种情况进行讨论:

  • 生产者弄丢了数据
      可以开启confirm模式。在生产者哪里设置开启了confirm模式之后,每次写的消息都会分配一个唯一的id,然后如何写入了rabbitmq之中,rabbitmq会给你回传一个ack消息,告诉你这个消息发送OK了;如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息失败了,你可以进行重试。而且你可以结合这个机制知道自己在内存里维护每个消息的id,如果超过一定时间还没接收到这个消息的回调,那么你可以进行重发。
  • rabbitmq自己弄丢了数据
      设置消息持久化到磁盘。设置持久化有两个步骤:
    ①创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里面的数据。
    ②发送消息的时候讲消息的deliveryMode设置为2,这样消息就会被设为持久化方式,此时rabbitmq就会将消息持久化到磁盘上。
    必须要同时开启这两个才可以。
      而且持久化可以跟生产的confirm机制配合起来,只有消息持久化到了磁盘之后,才会通知生产者ack,这样就算是在持久化之前rabbitmq挂了,数据丢了,生产者收不到ack回调也会进行消息重发。
  • 消费者弄丢了数据
      使用rabbitmq提供的ack机制,首先关闭rabbitmq的自动ack,然后每次在确保处理完这个消息之后,在代码里手动调用ack。这样就可以避免消息还没有处理完就ack。

一致性问题

  A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?
  D系统处理失败,意味着没有将ack返回给MQ,MQ会定时重复发送未收到ack的消息,为了保证数据不出现重复的情况,即幂等性,对于每条消息,MQ内部生成一个全局唯一、与业务无关的消息ID:inner-msg-id。当MQ-server接收到消息时,先根据inner-msg-id判断消息是否重复发送,再决定是否将消息落地到DB中。这样,有了这个inner-msg-id作为去重的依据就能保证一条消息只能一次落地到DB。

三、常见的MQ产品

四、RabbitMQ中的概念

RabbitMQ 中的相关概念:

  • Broker:接收和分发消息的应用,RabbitMQ Server就是 Message BrokerVirtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange/queue 等
  • Connection:publisher/consumer 和 broker 之间的 TCP 连接
  • Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCPConnection的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的 channel 进行通讯,AMQP method 包含
    了channel id 帮助客户端和message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销
  • Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
  • Queue:消息最终被送到这里等待 consumer 取走
  • Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据

五、如何实现RabbitMQ的延迟对列

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。

需求:

  1. 下单后,30分钟未支付,取消订单,回滚库存。
  2. 新用户注册成功7天后,发送短信问候。

实现方式:

  1. 定时器(性能损耗过大,不考虑)
  2. 延迟队列

分布式消息中间件之rabbitmq学习笔记[一](代码片段)

写在前面嗯,陆续的整理一些中间件的笔记今天和小伙伴们分享RabbitMQ相关笔记博文偏理论,内容涉及:RabbitMQ的简单介绍AMQP协议标准介绍RabbitMQDemo食用方式:了解生产者消费者模式通过本文,对RabbitMQ有大概认识... 查看详情

分布式消息中间件之rabbitmq学习笔记[一](代码片段)

写在前面嗯,陆续的整理一些中间件的笔记今天和小伙伴们分享RabbitMQ相关笔记博文偏理论,内容涉及:RabbitMQ的简单介绍AMQP协议标准介绍RabbitMQDemo食用方式:了解生产者消费者模式通过本文,对RabbitMQ有大概认识... 查看详情

学习笔记《rabbitmq实战指南》笔记(代码片段)

本文摘录总结自《RabbitMQ实战指南》。一、消息中间件消息队列中间件(MessageQueueMiddleware,简称为MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它... 查看详情

学习笔记《rabbitmq实战指南》笔记(代码片段)

本文摘录总结自《RabbitMQ实战指南》。一、消息中间件消息队列中间件(MessageQueueMiddleware,简称为MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。它... 查看详情

rabbitmq超详细学习笔记(章节清晰+通俗易懂)(代码片段)

早在之前就了解到了消息中间件,但是一直没有系统的学习,最近花了一段时间系统学习了当下最为主流的RabbitMQ消息队列,学习过程中也随时记录,刚开始学习的时候懵懵懂懂,做的笔记都比较杂乱,系... 查看详情

rabbitmq学习笔记(代码片段)

文章目录1.RabbitMq(消息中间件)1.概念:是基于队列模式实现的异步/同步的传输数据。2.传统的Http请求存在哪些缺点?3.mq的使用场景?4.mq服务器如何保证消息不丢失?5.VirtualHost?Exchange分派我们的消息存放在哪个队... 查看详情

rabbitmq学习笔记(代码片段)

文章目录RabbitMq(消息中间件)1.概念:是基于队列模式实现的异步/同步的传输数据。2.传统的Http请求存在哪些缺点?3.mq的使用场景?4.mq服务器如何保证消息不丢失?5.VirtualHost?Exchange分派我们的消息存放在哪个队列... 查看详情

节清晰+通俗易懂)(代码片段)

早在之前就了解到了消息中间件,但是一直没有系统的学习,最近花了一段时间系统学习了当下最为主流的RabbitMQ消息队列,学习过程中也随时记录,刚开始学习的时候懵懵懂懂,做的笔记都比较杂乱,系... 查看详情

rabbitmq学习

...队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订... 查看详情

rabbitmq消息队列笔记(代码片段)

...发布处理异步未确认的消息RabbitMQ概念RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快 查看详情

rabbitmq消息中间件技术精讲

...体安排与学习建议,然后为大家简单介绍下业界主流消息中间件有哪些,各自适用场景等。1-1课程导学1-2业界主流消息中间件介绍第2章低门 查看详情

rabbitmq消息中间件技术精讲

...体安排与学习建议,然后为大家简单介绍下业界主流消息中间件有哪些,各自适用场景等。1-1课程导学1-2业界主流消息中间件介绍第2章低门槛,入门RabbitMQ核心概念本章首先为大家讲解互联网大厂为什么选择RabbitM 查看详情

rabbitmq学习笔记2-理解消息通信

...的相关信息,包含具体的交换器、消息的接受兴趣方等。rabbitmq的基础流程如下:RabbitMQ的客户端和服务端通过channel与RabbitMQ服务器进行通信。Channel(信道):程序和RabbitMQ之间的连接是通过channel,channel是基于TCP协议之上的?,一个... 查看详情

rabbitmq笔记(代码片段)

...有业务逻辑的侵入,轻松的实现系统间解耦。别名为消息中间件通过利用高效可靠的消息传递机制进行平台无关的数据交流&# 查看详情

rabbitmq笔记(代码片段)

...有业务逻辑的侵入,轻松的实现系统间解耦。别名为消息中间件通过利用高效可靠的消息传递机制进行平台无关的数据交流&# 查看详情

rabbitmq学习笔记3:rabbitmq快速入门消息模式

一、RabbitMQ快速入门1、什么是RabbitMQ?(是基于AMQP协议的实现者,用Erlang语言写的。支持多种语言,用于在分布式系统中存储消息、转发消息,具有高可用、高可扩、易用性等特性。)2、RabbitMQ的安装、Web... 查看详情

rabbitmq学习笔记五:rabbitmq之优先级消息队列

RabbitMQ优先级队列注意点:1、只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效2、RabbitMQ3.5以后才支持优先级队列代码在博客:RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成 最后面有下载地址,只是做... 查看详情

rabbitmq学习笔记5:rabbitmq高级

...都可以被消费者接收获取;过了之后消息将自动被删除。2.RabbitMQ可以对消息和队列设置TTL,目前有两种方法可以设置:第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息进行单独设置,... 查看详情