分布式消息队列选型分析

高并发架构是成为架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!可否驾驭消息队列这款高并发神器,亦成为架构师的试金石。本文将从队列本质、技术选型两个方面,给你们整理下我的心得,但愿能对你们有所帮助。java

0前言

MQ全称为Messages Queue ,消息队列是应用程序和应用程序之间的通讯方法mysql

为何使用MQ?web

在项目中,可将一些无需耗时的操做提取出来,进行异步操做,而这种异步处理方式大大的姐生了服务器的请求响应时间,从而提升了系统的吞吐量。面试

常见应用场景sql

开发中消息列队一般有如下应用场景数据库

1.任务异步处理将不须要同步处理的斌且好使长的操做由消息队列通知消息接收方进行异步处理。提升了应用的响应时间apache

2.应用程序解耦合MQ至关于一个中介,生产放经过MQ与消费方交互,它将应用程序进行解耦合。编程

1队列本质

当下成熟的消息队列产品很是多,各类丰富的特性让人眼花缭乱,难以抉择。后端

穿透现象先看本质,消息队列其实就是一个第三方应用程序,管理着一起内存空间,能快速存取数据,具有先进先出特性。只是跟系统架构设计相结合,产生了神奇的特效,请看下图:缓存

基于消息队列的异步架构图

消息队列的好处 

一、流量削峰: 高并发的核心问题就是请求集中在同一时间,服务器来不及处理,而有了消息队列,就能够将请求的数据打包放入,而后由后端处理器异步处理,下降高峰期的并发处理压力,用时间换空间

二、高可用性: 90%系统的不可用都是由于数据库,而在异步化架构里,就算数据库挂掉、甚至处理器挂掉,均不影响系统的可用性,客户端能够继续响应请求,只是将请求堆积在消息队列便可

三、高扩展性: 异步化架构里,客户端和处理器是经过消息来交互的,只要保证消息格式不变,能够随意独立演化扩展。

2技术选型

男怕入错行,女怕嫁错郎,技术选型很迷茫!网上也有各类关于技术选型分析的文章,更容易让人产生混乱之感,下面我结合下我的开发实践经历,以及精选测试后的有效数据,给你们作下分析和推荐,仅一家之言!

一、kafka

官网:kafka.apache.org/

 

 


全部开源的MQ中吞吐量最强的,自然支持集群,消息堆积能力很是强悍。Apache下的子项目,使用scala语言实现的一个高性能分布式Publish/Subscribe消息队列系统。不管在数据可靠性、稳定性和功能特性等方面均可以知足绝大多数场景的需求,并且拥有着极致性能。

特色

  1. 快速持久化:经过磁盘顺序读写与零拷贝机制,能够在0(1)的系统开销下进行消息持久化
  2. 高吞吐:在一台普通的服务器上便可以达到10W/s的吞吐速率。
  3. 高堆积:支持topoc下消费者较长时间离线,消息堆积量大
  4. 彻底的分布式系统:Brocker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡
  5. 支持Hadoop数据并行加载:对于像Hadoop的同样的日志数据和离线分系统,但又要求实时处理的限制,这是一个可行的解决方案。

可是其致命伤在于Kafka是为了性能选择了异步批量发送模式,致使 延时过高,没法知足在线业务场景,经常使用于日志数据分析等场景 !
二、RocketMQ

官网:rocketmq.apache.org/

 

 


RocketMQ国产阿里的,通过双十一的检验。也很是强悍,基于java语言写的RocketMQ的前身是Metaq,当Metaq3.0发布时,产品名称改成RocketMQ。RocketMQ是一款分布式、队列模型的消息中间件,做为优秀的国产消息队列,近年来愈来愈多的被国内众多大厂使用。

特色

  1. 可以保证严格的消息顺序
  2. 提供丰富的消息拉取模式
  3. 高效的订阅水平扩展能力
  4. 实时的消息订阅机制
  5. 支持事务消息
  6. 亿级消息堆积能力


三、ActiveMQ

官网:activemq.apache.org/

 

 


最老牌的开源消息队列,想当年是开源消息队列首选,不过眼下已进入老年期,社区不活跃了。不管是功能仍是性能,ActiveMQ 都已经与现代的消息队列存在明显的差距,它存在的意义在于兼容那些还在用老系统,好比2013年我给广东电信作外包项目时接入的仍是ActiveMQ!

特色

  1. 支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各类跨语言客户端和协议
  2. 彻底支持JMS客户端和Message Broker中的企业集成模式
  3. 支持许多高级功能,如消息组,虚拟目标,通配符和复合目标
  4. 彻底支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息
  5. Spring支持,以便ActiveMQ能够轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置
  6. 专为高性能集群,客户端 - 服务器,基于对等的通讯而设计
  7. CXF和Axis支持,以便ActiveMQ能够轻松地放入这些Web服务堆栈中以提供可靠的消息传递
  8. 能够用做内存JMS提供程序,很是适合单元测试JMS
  9. 支持可插拔传输协议,例如in-VM,TCP,SSL,NIO,UDP,多播,JGroups和JXTA传输
  10. 使用JDBC和高性能日志支持很是快速的持久性


四、RabbitMQ 

官网:www.rabbitmq.com/

 

 

特色是Messaging that just works,“开箱即用的消息队列”。也就是说,RabbitMQ 是一个至关轻量级的消息队列, 很是容易部署和使用。
使用Erlang编写的一个开源的消息队列,自己支持不少的协议:AMQP,XMPP,SMTP,STOMP,它是一种应用程序之间的涌信方法,在分布式系统开发中应用很是广乏,正是如此使它变得很是重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由,负载均衡、数据持久化都有很好的支持。多用于进行企业级的ESB整合。

特色

  1. 异步消息传递:支持多种消息协议,消息队列,传送确认,灵活的路由到队列,多种交换类型;
  2. 支持几乎全部最受欢迎的编程语言:Java,C,C ++,C#,Ruby,Perl,Python,PHP等等;
  3. 能够部署为高可用性和吞吐量的集群; 跨多个可用区域和区域进行联合;
  4. 可插入的身份验证,受权,支持TLS和LDAP。;
  5. 提供了一个易用的用户界面,使得用户能够监控和管理消息 Broker 的许多方面;
  6. 提供了许多插件,来从多方面进行扩展,也能够编写本身的插件。

RabbitMQ提供了6种模式

  • 简单模式
  • work工做模式
  • publish/Subscribe发布与订阅模式
  • Routing路由模式
  • Topics主题模式
  • RPC远调用模式(远程调用,不太算MQ)

3最后

今天就写到这,我打算把MQ中的各个技术选型从入门到项目中的实战用法所有一级一级分享给你们,一是防止本身之后忘记能够回来翻翻看,二是分享给你们有兴趣的朋友能够一块儿学习。

熟悉MQ的朋友,可能看下来解决写的东西很简单,可是毕竟也有不少人实际工做中并无用过MQ,本身可能也没有了解过,对于没有了解过的朋友来讲,我以为入个门仍是挺不错的。


 

福利时间:前面给你们分享了一份Java核心知识点.pdf以及阿里巴巴Java开发手册全集,本次又给你们整理了一份Java面试宝典:
公众号后台回复:【2020】,获取【Java核心知识点.pdf】一份公众号后台回复:【手册】,获取【阿里巴巴Java开发手册全集】一份
公众号后台回复:【面试】,获取【最新Java面试宝典】一分内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列,高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等。

相关文章
相关标签/搜索