美文网首页
RabbitMQ总结

RabbitMQ总结

作者: Hitooo | 来源:发表于2020-06-23 09:02 被阅读0次

RabbitMQ总结

基础知识

为什么要用消息队列

队列是一种先进先出的数据结构。

消息队列是分布式系统中重要的组件,

  1. 通过异步处理提高系统性能(削峰、减少响应所需时间)

    在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。

  2. 降低系统耦合性

    消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。

引入问题

  • 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!
  • 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!
  • 一致性问题:万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!

设计规范

由于消息队列的跨语言、跨平台的需求,发展出不同的规范

JMS

JMS(JAVA Message Service,java消息服务)是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。 ActiveMQ 就是基于 JMS 规范实现的。

  • 点到点(P2P)模型: 一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。
P2P
  • 发布/订阅(Pub/Sub)模型: 主题(Topic作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。
Pub/sub

AMQP

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准 高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制

  • AMQP 为消息定义了线路层(wire-level protocol)的协议,而JMS所定义的是API规范。在 Java 体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差。而AMQP天然具有跨平台、跨语言特性。
  • JMS 支持TextMessage、MapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。
  • 由于Exchange 提供的路由算法,AMQP可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

相关面试题

RabbitMQ队列六种工作模式

  1. 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式
public class Producer {

    /** 队列名称 */
    private static final String QUEUE_NAME = "test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        /** 1.获取连接 */
        Connection newConnection = MQConnectionUtils.newConnection();
         /** 2.创建通道 */
        Channel channel = newConnection.createChannel();
         /** 3.创建队列声明 */
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String msg = "我是生产者生成的消息";
        System.out.println("生产者发送消息:" + msg);
         /** 4.发送消息 */
        channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
        channel.close();
        newConnection.close();
    }
}
  1. 工作模式:一个消息生产者,一个交换器,一个消息队列,多个消费者,多个消费者根据配置按序处理队列中的消息。同样也称为点对点模式,上面的消费者相关代码启动两次即可模拟。

  2. 发布订阅: 可以将一个消息发送给不同类型的消费者。消息通过交换机同时发送到不同队列,不同队列的消费者可以收到相同的消息。队列绑定同一个交换机,而不是消费者绑定一个队列。

pub/sub
  1. 路由模式: 路由模式跟发布订阅模式类似,然后在订阅模式的基础上加上了类型,订阅模式是分发到所有绑定到交换机的队列,路由模式只分发到绑定在交换机上面指定路由键的队列,我们可以看一下下面这张图:

    img
  2. 主题模式: topics 主题模式跟 routing 路由模式类似,只不过路由模式是指定固定的路由键 routingKey,而主题模式是可以模糊匹配路由键 routingKey,类似于SQL中 = 和 like 的关系。

    img
  3. RPC模式:Client充当生产者,将请求发送到rabbitmq队列中,Server作为消费者,处理Client请求产生结果数据result,此刻Server作为生产者,将result通过rabbitmq队列传递到Client,Client作为结果数据的消费者,得到result

img
![img](https://img.haomeiwen.com/i2758946/c015203772a97099.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 

延时队列

消息丢失

重复消费

相关文章

  • RabbitMQ学习

    MQ入门总结(五)RabbitMQ的原理和使用Spring Boot 中使用 RabbitMQ -- 很棒Cent...

  • RabbitMq总结

    Rabbitmq 应用场景 异步、解耦、削峰、发布订阅、事物一致性等等 windows集群搭建 1.下载erlan...

  • RabbitMQ总结

    生产者、交换机、队列、消费者关系 如何保证RabbitMQ的高可用 避免消息堆积 避免消息丢失 如何保证不重复消费...

  • RabbitMQ总结

    RabbitMQ总结 基础知识 为什么要用消息队列 队列是一种先进先出的数据结构。 消息队列是分布式系统中重要的组...

  • RabbitMQ总结

    这里只做个人技术笔录,不搞一堆的废话官网中提示:RabbitMQ实现了多种协议。此处测试使用AMQP 0-9-1协...

  • RabbitMq总结

    可以先在管理控制页面中配置好exchange和对应的queue。 rabbitmq消息发送可靠性 一般消息发送可靠...

  • RabbitMQ总结

    ****- 前言 -**** RabbitMQ 是基于 AMQP 协议的,通过使用通用协议就可以做...

  • RabbitMQ实战:扩展RabbitMQ与系列总结

    本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。 本篇是「RabbitMQ实战」系列的最后...

  • RabbitMQ 核心概念总结

    [TOC] RabbitMQ 核心概念总结 ConnectionFactory 获取连接工厂 Connection...

  • RabbitMQ实战:性能和安全

    本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。 前两篇介绍了RabbitMQ在可用性、监...

网友评论

      本文标题:RabbitMQ总结

      本文链接:https://www.haomeiwen.com/subject/awdcfktx.html