分布式消息中间件_1 消息中间件核心思想和RabbitMQ环境搭建

                                           分布式消息中间件

                              1 消息中间件核心思想和RabbitMQ环境搭建

                                                                                                                                                                                                田超凡

                                                                                                                                                                                           20191213

 

1 消息中间件

在分布式系统中,对于客户端发送的一次请求,有时需要服务器多个子系统之间相互通讯、互相调用才能处理,此时如果使用传统的HTTP协议在子系统之间进行相互调用,如果部分子系统接口在调用的时候处理时间过长,那么处理请求的过程中只能阻塞线程并等待,如果调用的子系统数量增多的话,必然会导致处理请求的时间过长,甚至会出现服务器响应超时等一系列问题,严重影响客户端体验。

此时,对于前台可以考虑使用ajax做异步请求处理,但是会导致客户端需要发送多次请求,影响执行效率,远不及在后台直接一次性封装好,对外只暴露一个接口,也就是对于前台而言只需要请求一次,子系统之间的调用在后台实现的时候可以采用消息中间件来进行异步通讯和数据传输。

消息中间件的核心思想就是在多个分布式子系统中进行异步通讯,在多个子系统之间相互传递消息。生产者把消息发布到MQ消息中间件,通知所有订阅该消息队列的消费者进行消费,消费者只需要订阅MQ消息中间件就可以获取到生产者发布的相同消息队列中的消息,实现生产者和消费者之间异步通讯和数据传输,并且实现了生产者和消费者之间完全解耦,互不影响。

2 消息中间件应用场景

 

比如用户注册的业务场景:

用户注册时,需要依次调用新增会员信息、发放优惠券、发送短信提醒等子系统接口,假设调用数据库新增插入会员信息需要3s、调用优惠券接口需要3s、调用第三方短信接口需要3s  一共需要9s的时间才会返回信息,这样用户的体验是非常不好。

可以使用多线程的方式来实现异步操作,主线程只负责新增会员信息,发放优惠券、发送短信提醒都交给子线程来做,但是这样做也是存在很大弊端和瓶颈的:

  1. 高并发访问下,很容易造成线程阻塞和线程池满的情况,导致服务直接崩溃。
  2. 新增会员信息成功之后,无法保证发放优惠券和发送短信提醒的子线程都执行成功了,也就是说无法准确获取子线程的处理结果。这样一来,整个会员注册的业务场景对部分子系统的调用完整性是不能保证的(比如很有可能新增用户成功,但是发放优惠券失败或者发送短信提醒失败,都是有可能的)

 

但是如果使用消息中间件来实现的话,由于生产者和消费者之间是异步通讯和数据传输的,都是通过绑定相同的消息队列来保持生产者和消费者之间数据同步的,所以对于生产者发布结果、消费者消费结果、消费者执行情况和返回结果都是可以互相感知和监听的,另外消息中间件还会对生产者发布成功、消费者没有消费成功的消息进行缓存,当消费者连接到MQ的时候就会自动根据消息队列名获取消息队列信息给消费者进行消费。消息中间件还有自动补偿和重试、流量消峰等机制来保证高并发场景下子系统异步通讯的正常运作。

 

3 消息中间件核心思想

  1. 异步通讯
  2. 自动补偿和重试
  3. 分布式事务
  4. 流量消峰
  5. 系统解耦
  6. 消息幂等
  7. 消息顺询

 

4 市面主流的消息中间件

ActiveMQ 不能很好的支持高并发和大量的消息队列,基本已被淘汰

历史悠久的开源项目,是Apache下的一个子项目。已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多),支持持久化到数据库,对队列数较多的情况支持不好。

 

RabbitMQ 稳定性强、支持多种消息队列协议

结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。

 

Kafka 支持线程高并发和消息高堆积,擅长做大数据日志收集和处理

Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe发布-订阅消息队列系统,具有以下特性:

高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;

高堆积:支持topic下消费者较长时间离线,消息堆积量大

 

RocketMQ 适合搭建MQ消息中间件集群,实现高可用

阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。

 

5 RabbitMQ环境搭建

  1. RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),RabbitMQ服务器是用Erlang语言编写的。

RabbitMQ官方网站:https://www.rabbitmq.com/

 

  1. RabbitMQ五种常用的消息队列类型:

简单点对点

工作点对点

发布订阅

路由

通配符

RPC远程服务调用(不稳定,目前不常用)

 

  1. RabbitMQ环境安装

下载并安装erlang,下载地址:http://www.erlang.org/download

配置erlang环境变量信息

  新增环境变量ERLANG_HOME=erlang的安装地址

  将%ERLANG_HOME%\bin加入到path中

下载并安装RabbitMQ

注意: RabbitMQ 依赖于erlang,必须先安装erlang并配置环境变量

  1. RabbitMQ管理平台

RabbitMQ 管理平台地址 http://127.0.0.1:15672

默认账号:guest/guest  用户可以自己创建新的账号

 

Virtual Hosts虚拟主机 — 子MQ消息中间件

像MySQL有数据库分片的概念,并且可以指定不同用户对不同数据库和表的操作的权限,RabbitMQ也有类似的权限管理。

在RabbitMQ中使用虚拟消息服务器VirtualHost来实现RabbitMQ消息中间件分片每个VirtualHost相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的exchange、queue、message不能互通。

 

注意:RabbitMQ环境搭建成功后,默认端口配置说明如下:

默认端口15672:RabbitMQ管理平台端口号

默认端口5672: RabbitMQ消息中间内部通讯的端口
默认端口25672RabbitMQ集群端口

 

  1. RabbitMQ基本使用步骤

创建Virtual Host虚拟主机

创建账户,授予不同虚拟主机操作管理权限

创建Queue消息队列

生产者和消费者连接RabbitMQ消息中间件

生产者发布消息,消费者获取消息

 

 

转载请注明原作者

 

发布了100 篇原创文章 · 获赞 10 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_30056341/article/details/103535006