详解RabbitMQ消息队列的概念、架构及使用场景

概述

之前我们的系统是用JMS来做消息队列,领导突发奇想想用开源的东西,所以选定了大名鼎鼎的rabbitMQ(啥都敌不过领导的一个想法),下面对rabbitMQ做个初步探讨。


背景

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。

RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。


RabbitMQ的介绍

详解RabbitMQ消息队列的概念、架构及使用场景

从上面的目前常用的消息中间件来说,感觉Kafka更好些,Kafka是大数据时代诞生的消息中间件,但对于目前来说使用最广的还是RabbitMQ 。

**Advanced Message Queuing Protocol (高级消息队列协议** The Advanced Message Queuing Protocol (AMQP):

是一个标准开放的应用层的消息中间件(Message Oriented Middleware)协议。AMQP定义了通过网络发送的字节流的数据格式。因此兼容性非常好,任何实现AMQP协议的程序都可以和与AMQP协议兼容的其他程序交互,可以很容易做到跨语言,跨平台。

先介绍一个结构图,这样会更好地去理解RabbitMQ的基本原理。

详解RabbitMQ消息队列的概念、架构及使用场景

通过上面这张应用相结合的结构图既能够清晰的看清楚整体的send Message到Receive Message的一个大致的流程。


RabbitMQ使用场景

RabbitMQ是一个消息中间件,消息中间件【最主要的作用:信息的缓冲区】还是得从应用场景来看下:

1、系统集成与分布式系统的设计

各种子系统通过消息来对接,这种解决方案也逐步发展成一种架构风格,即“通过消息传递的架构”。

举个例子:现在医院有两个科“看病科”和“住院科”在之前他们之间是没有任何关系的,如果你在“看病课”看完病后注册的信息和资料,到住院科后还得重新注册一遍?那现在要改革,你看完病后可以直接去住院科那两个系统之间需要打通怎么办?这里就可以使用我们的消息中间件了。

2、异步任务处理结果回调的设计

举个例子:记录日志,假如需要记录系统中所有的用户行为日志,如果通过同步的方式记录日志势必会影响系统的响应速度,当我们将日志消息发送到消息队列,记录日志的子系统就会通过异步的方式去消费日志消息。这样不需要同步的写入日志了NICE

3、并发请求的压力高可用性设计

举个例子:比如电商的秒杀场景。当某一时刻应用服务器或数据库服务器收到大量请求,将会出现系统宕机。如果能够将请求转发到消息队列,再由服务器去消费这些消息将会使得请求变得平稳,提高系统的可用性。


RabbitMQ和一般的消息传输模式:队列模式&主题模式区别

1、队列模式

详解RabbitMQ消息队列的概念、架构及使用场景

一个发布者发布消息,下面的接收者按队列顺序接收,比如发布了10个消息,两个接收者A,B那就是A,B总共会收到10条消息,不重复。

2、主题模式

详解RabbitMQ消息队列的概念、架构及使用场景

对于Topic模式,一个发布者发布消息,有两个接收者A,B来订阅,那么发布了10条消息,A,B各收到10条消息。

3、RabbitMQ的模式

详解RabbitMQ消息队列的概念、架构及使用场景

生产者生产消息后不直接直接发到队列中,而是发到一个交换空间:Exchange,Exchange会根据Exchange类型和Routing Key来决定发到哪个队列中


篇幅有限,关于rabbimtMQ方面内容就介绍到这了,后面会介绍下怎么去搭建rabbitMQ环境,感兴趣的朋友可以关注下!

详解RabbitMQ消息队列的概念、架构及使用场景

相关推荐