RabbitMQ学习笔记-RabbitMQ简介

跟風遠走 提交于 2020-02-27 02:46:31

导语
  RabbitMQ 是现在比较热门的消息中间件,在互联网行业和传统行业都有大量地使用。消息中间件有很多,RabbitMQ在高可靠、易扩展、高可用等方面都有很大的优势。在学习RabbitMQ的过程中都有所提升。

消息中间件介绍

  消息(Message) 在应用之前传递数据,消息可以是一个字符串,也可以是JSON数据,XML数据等等,当然也可以是复杂的对象。对于消息这个是一个抽象的定义,在任何应用之间的数据传递都可以称为消息,例如QQ消息,微信消息等等。
  消息队列中间件(Message Queue Middleware,简称MQM)是指高效的传递机制进行平台之间的与平台无关的数据交流,基于数据通信的方式来进行分布式系统的集成。通过提供一个消息队列和消息的排队模型,可以在分布式环境下进行扩展消息传递。
  对于消息中间件来说一般有两种传递模式,当然也有其他的,但是常用的就是以下的两种方式

  • 点对点模式
  • 发布订阅模式

  点对点模式是基于队列的模式,消息生产者发送消息到消息队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传递称为可能,例如在RocketMQ中消息的落地,可以使得消息重传。
  发布订阅模式定义如何将统一的内容发布到不同的节点上,这个统一的内容被称为主题,主题可以成为传递消息的标识,发布者将消息发布到某个主题上,订阅者可以通过订阅某个主题来进行消息的获取,这样通过这种方式可以实现消息发布者和消费者的两者的相对独立,类似于广播。

  现在有很多的消息中间件,比较主流的就是Kafka、RocketMQ、ActiveMQ等等,面向消息的中间,提供了松耦合的方式进行应用之间的消息传递机制。提供了基于存储和转发的应用程序之间的异步数据发送,可以保证应用之间不是直接通信,作为中介进行消息高级处理。消息中间件提供了又保证的消息发送,应用程序的开发者可以无需了解远程调用RPC和网络传输的细节问题。

  消息中间件的推出为分布式系统提供了一个可靠的数据传递方式。在采用了消息中间件的系统中,不同的对象之间通过传递消息来激活对方的事件,完成对应的操作,当然也会设置及到分布式事务等等的一些操作。发送者将消息发送给消息服务器,消息服务器将消息存放到若干的队列中,在合适的时候将消息转发给接收者。消息中间件在不同的平台之间进行消息的通信,用来协调某些平台之间语言的差异、通信方式的差异等,实现不同系统之间的协同,优点就是在于在能在客户端和服务器之间控制同步和异步的连接,并且在任何时候进行传送和存储转发,这就是消息调用比过程调用更加可靠的原因。

在这里插入图片描述
  如图所示,应用程序A和应用程序B之间通过API进行调用,消息中间件将消息通过路由发送给应用程序B,这样同样的消息就会在不同的计算机上存在着。消息中间件负责处理网络通信,如果网络连接不可用,消息中间件就会对消息进行存储,等到网络连接变得可用的时候再将消息转发给应用程序B。

  当应用程序A发送其消息时,应用程序B可以处于不运行的状态,消息中间件中保留消息,直到应用程序B开始执行并且消费消息,这样可以防止了应用程序A因为等待应用程序B消费消息出现阻塞,这种异步方式在大多数的应用设计中都得到了不同的应用。

消息中间件作用

解耦

  消息中间件在处理过程中有一个接口层,两边的处理过程都要实现这个接口,允许独立扩展或者修改两边的处理过程,只要确保两边使用同样的接口进行约束就可以了。

存储

  在有些情况下,数据处理过程失败,中间件可以把消息进行持久化存储,通过这个方式避免数据丢失的风险,把这个消息从数据持久化中删除需要确定是否已经被消费处理了。

扩展性

   消息中间件解耦了应用的处理过程,提高消息入队和处理的效率是很容易,只需要另外增加一个处理过程即可,不需要修改代码,不需要修改参数。

流量削峰

  在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不是常见的。如果以能处理这类峰值为标准进行资源投入,这个时候就导致多余资源的浪费。使用消息中间件就能在流量过大的时候不会因为负载过重导致系统崩溃。

可恢复

  当系统中的一部分组件失效之后,不会影响整个系统,中间件降低了各个系统应用之间的耦合度,所以整个的处理消息进程宕机之后加入消息中间件的消息仍然可以在系统恢复之后进行处理。

顺序保证

在大多数的情况下中间件都需要支持消息的顺序性,大部分的消息中间件都支持消息的顺序性

缓冲

  在任何的系统中,都会存在需要处理事件无关的元素,消息中间件通过缓冲层来帮助其他与时间有关的消息进行处理,有助于整个系统的高效运行

异步通信

  在很多的时候,对于异步通信的理解就是暂时先不需要立即处理,就可以将其放入消息中间件中,等待处理进程处理,先将需要的结果返回,然后处理成功之后在返回一个确认的结果。

RabbitMQ 起源

   Rabbit MQ是采用Erlong 编写的支持AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,最初是用于金融系统,现在更多被用在分布式系统中存储转发消息。

  在Java中提供过一个Java Message Service,试图通过公关Java API 的方式,隐藏单独的MQ产品提供接口,有点类似于JDBC。从技术上将,Java 应用程序只需要针对JMS API编程,选择适合的MQ驱动就可以了,JMS会提供其他的支持,ActiveMQ 就是JMS的一种实现。但是这个与数据库不同的是数据消息结构比较多,暴露出的问题也比较多。

  RabbitMQ 最初实现就是实现了一个AMQP的关键特性:使用协议本身就可以对队列和交换器这样的资源进行配置化,RabbitMQ 的资源配置能力让它的构建可以称为一个完美的分布式消息总线,这样特别有助于基于云资源的快速开发。

  RabbitMQ 具体的特点可以概括为以下的几个方面

  • 可靠性:RabbitMQ 使用一些机制来保证可靠性,例如持久化、确认重传等
  • 灵活的路由:在消息进入到消息队列中,通过交换路器来路由消息。对典型的路由功能,RabbitMQ提供了内置交换器来实现。当然对于复杂的路由也可以通过多个交换器的组合来实现,也可以通过插件来提供第三方的交换器。
  • 扩展性:多个RabbitMQ 节点可以组成一个集群,可以根据实际业务情况动态扩展节点
  • 高可用性:队列可以在集群中的机器上设置镜像,是的在部分节点中出现问题整个的集群也可以使用
  • 多种协议:RabbitMQ 处理支持AMQP协议,还可以支持STOMP、MQTT等多种消息协议
  • 多语言客户端:提供了Java、Python、Ruby、PHP、C#、JavaScript等
  • 管理界面:RabbitMQ 提供了一个简单的用户界面,使用用户可以监控和管理消息以及集群中的节点
  • 插件机制: RabbitMQ 提供了许多插件,实现了对多个方面的扩展,也支持了自己的插件。

总结

  上面内容主要总结了关于消息中间件以及RabbitMQ的一些简单的必须知道的理论知识,有了理论知识的支持,在后面的分享中就可以介绍关于RabbitMQ的高级知识了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!