乐趣区

关于java:我笑了面试加薪题竟然是有关RabbitMQ的

MQ 简介

在计算机科学中,音讯队列(英语:Message queue)是一种过程间通信或同一过程的不同线程间的通信形式,软件的贮列用来解决一系列的输出,通常是来自用户。音讯队列提供了异步的通信协议,每一个贮列中的纪录蕴含具体阐明的数据,蕴含产生的工夫,输出设施的品种,以及特定的输出参数,也就是说:音讯的发送者和接收者不须要同时与音讯队列互交。音讯会保留在队列中,直到接收者取回它。

实现

​ 音讯队列经常保留在链表构造中。领有权限的过程能够向音讯队列中写入或读取音讯。

目前,有很多音讯队列有很多开源的实现,包含 JBoss MessagingJORAMApache ActiveMQSun Open Message QueueIBM MQApache QpidHTTPSQS

以后应用较多的音讯队列有 RabbitMQRocketMQActiveMQKafkaZeroMQMetaMq 等,而局部数据库如 RedisMysql 以及 phxsql 也可实现音讯队列的性能。

特点

​ MQ 是消费者 - 生产者模型的一个典型的代表,一端往音讯队列中一直写入音讯,而另一端则能够读取或者订阅队列中的音讯。MQ 和 JMS 相似,但不同的是 JMS 是 SUN JAVA 消息中间件服务的一个规范和 API 定义,而 MQ 则是遵循了 AMQP 协定的具体实现和产品。

​ 留神:

  1. AMQP,即 Advanced Message Queuing Protocol, 一个提供对立音讯服务的应用层规范高级音讯队列协定, 是应用层协定的一个凋谢规范, 为面向音讯的中间件设计。基于此协定的客户端与消息中间件可传递音讯,并不受客户端 / 中间件不同产品,不同的开发语言等条件的限度。
  2. JMS,Java 音讯服务(Java Message Service)利用程序接口,是一个 Java 平台中对于面向消息中间件的 API,用于在两个应用程序之间,或分布式系统中发送音讯,进行异步通信。Java 音讯服务是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供反对。常见的音讯队列,大部分都实现了 JMS API,如 ActiveMQRedis 以及 RabbitMQ 等。

优缺点

长处

利用耦合、异步解决、流量削锋

  • 解耦

    传统模式:

传统模式的毛病:

零碎间耦合性太强,如上图所示,零碎 A 在代码中间接调用零碎 B 和零碎 C 的代码,如果未来 D 零碎接入,零碎 A 还须要批改代码,过于麻烦!

中间件模式

中间件模式的的长处:

将音讯写入音讯队列,须要音讯的零碎本人从音讯队列中订阅,从而零碎 A 不须要做任何批改。

  • 异步

传统模式:

传统模式的毛病:

一些非必要的业务逻辑以同步的形式运行,太消耗工夫。

中间件模式:

中间件模式的的长处:

将音讯写入音讯队列,须要音讯的零碎本人从音讯队列中订阅,从而零碎 A 不须要做任何批改。

  • 削峰

传统模式:

传统模式的毛病:

并发量大的时候,所有的申请间接怼到数据库,造成数据库连贯异样

中间件模式:

中间件模式的的长处:

零碎 A 缓缓的依照数据库能解决的并发量,从音讯队列中缓缓拉取音讯。在生产中,这个短暂的高峰期积压是容许的。

毛病

零碎可用性升高、零碎复杂性减少

应用场景

音讯队列,是分布式系统中重要的组件,其通用的应用场景能够简略地形容为:当不须要立刻取得后果,然而并发量又须要进行管制的时候,差不多就是须要应用音讯队列的时候

​ 在我的项目中,将一些无需即时返回且耗时的操作提取进去,进行了异步解决,而这种异步解决的形式大大的节俭了服务器的申请响应工夫,从而进步了零碎的吞吐量。

为什么应用 RabbitMQ

AMQP,即 Advanced Message Queuing Protocol,高级音讯队列协定,是应用层协定的一个凋谢规范,为面向音讯的中间件设计。消息中间件次要用于组件之间的解耦,音讯的发送者无需晓得音讯使用者的存在,反之亦然。

AMQP 的次要特色是面向音讯、队列、路由(包含点对点和公布 / 订阅)、可靠性、平安。

RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,反对多种客户端,如:PythonRuby.NETJavaJMSCPHPActionScriptXMPPSTOMP等,反对 AJAX。用于在分布式系统中存储转发音讯,在易用性、扩展性、高可用性等方面体现不俗。

​ 总结如下:

  • 基于 AMQP 协定
  • 高并发(是一个容量的概念,服务器能够承受的最大工作数量)
  • 高性能(是一个速度的概念,单位工夫内服务器能够解决的工作数)
  • 高可用(是一个长久的概念,单位工夫内服务器能够失常工作的工夫比例)
  • 弱小的社区反对,以及很多公司都在应用
  • 反对插件
  • 反对多语言
退出移动版