高并发架构是成为架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石。本文将从队列本质、技术选型两个方面,给大家整理下个人心得,希望能对大家有所帮助。
0
前言
MQ全称为Messages Queue ,消息队列是应用程序和应用程序之间的通信方法
为什么使用MQ?
在项目中,可将一些无需耗时的操作提取出来,进行异步操作,而这种异步处理方式大大的姐生了服务器的请求响应时间,从而提高了系统的吞吐量。
常见应用场景
开发中消息列队通常有以下应用场景
1.任务异步处理
将不需要同步处理的斌且好使长的操作由消息队列通知消息接收方进行异步处理。提高了应用的响应时间
2.应用程序解耦合
MQ相当于一个中介,生产放通过MQ与消费方交互,它将应用程序进行解耦合。
1
队列本质
当下成熟的消息队列产品非常多,各种丰富的特性让人眼花缭乱,难以抉择。穿透现象先看本质,消息队列其实就是一个第三方应用程序,管理着一块儿内存空间,能快速存取数据,具备先进先出特性。只是跟系统架构设计相结合,产生了神奇的特效,请看下图:
消息队列的好处 :
1、流量削峰: 高并发的核心问题就是请求集中在同一时间,服务器来不及处理,而有了消息队列,就可以将请求的数据打包放入,然后由后端处理器异步处理,降低高峰期的并发处理压力,用时间换空间
2、高可用性: 90%系统的不可用都是因为数据库,而在异步化架构里,就算数据库挂掉、甚至处理器挂掉,均不影响系统的可用性,客户端可以继续响应请求,只是将请求堆积在消息队列即可
3、高扩展性: 异步化架构里,客户端和处理器是通过消息来交互的,只要保证消息格式不变,可以随意独立演化扩展。
2
技术选型
男怕入错行,女怕嫁错郎,技术选型很迷茫!网上也有各种关于技术选型分析的文章,更容易让人产生混乱之感,下面我结合下个人开发实践经历,以及精选测试后的有效数据,给大家做下分析和推荐,仅一家之言!
1、kafka
官网:kafka.apache.org/
所有开源的MQ中吞吐量最强的,天然支持集群,消息堆积能力非常强悍。
Apache下的子项目,使用scala语言实现的一个高性能分布式Publish/Subscribe消息队列系统。无论在数据可靠性、稳定性和功能特性等方面都可以满足绝大多数场景的需求,而且拥有着极致性能。
特点:
快速持久化:通过磁盘顺序读写与零拷贝机制,可以在0(1)的系统开销下进行消息持久化
高吞吐:在一台普通的服务器上即可以达到10W/s的吞吐速率。
高堆积:支持topoc下消费者较长时间离线,消息堆积量大
完全的分布式系统:Brocker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡
支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分系统,但又要求实时处理的限制,这是一个可行的解决方案。
但是其致命伤在于Kafka是为了性能选择了异步批量发送模式,导致 延时太高,无法满足在线业务场景,常用于日志数据分析等场景 !
2、RocketMQ
官网:rocketmq.apache.org/
RocketMQ国产阿里的,经过双十一的检验。也非常强悍,基于java语言写的
RocketMQ的前身是Metaq,当Metaq3.0发布时,产品名称改为RocketMQ。RocketMQ是一款分布式、队列模型的消息中间件,作为优秀的国产消息队列,近年来越来越多的被国内众多大厂使用。
特点:
能够保证严格的消息顺序
提供丰富的消息拉取模式
高效的订阅水平扩展能力
实时的消息订阅机制
支持事务消息
亿级消息堆积能力
3、ActiveMQ
官网:activemq.apache.org/
最老牌的开源消息队列,想当年是开源消息队列首选,不过眼下已进入老年期,社区不活跃了。
无论是功能还是性能,ActiveMQ 都已经与现代的消息队列存在明显的差距,它存在的意义在于兼容那些还在用老系统,比如2013年我给广东电信做外包项目时接入的还是ActiveMQ!
特点:
支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议
完全支持JMS客户端和Message Broker中的企业集成模式
支持许多高级功能,如消息组,虚拟目标,通配符和复合目标
完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息
Spring支持,以便ActiveMQ可以轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置
专为高性能集群,客户端 - 服务器,基于对等的通信而设计
CXF和Axis支持,以便ActiveMQ可以轻松地放入这些Web服务堆栈中以提供可靠的消息传递
可以用作内存JMS提供程序,非常适合单元测试JMS
支持可插拔传输协议,例如in-VM,TCP,SSL,NIO,UDP,多播,JGroups和JXTA传输
使用JDBC和高性能日志支持非常快速的持久性
4、RabbitMQ
官网:www.rabbitmq.com/
特点是Messaging that just works,“开箱即用的消息队列”。也就是说,RabbitMQ 是一个相当轻量级的消息队列, 非常容易部署和使用。
使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP,它是一种应用程序之间的涌信方法,在分布式系统开发中应用非常广乏,正是如此使它变得非常重量级,更适合于企业级的开发。
同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由,负载均衡、数据持久化都有很好的支持。多用于进行企业级的ESB整合。
特点:
异步消息传递:支持多种消息协议,消息队列,传送确认,灵活的路由到队列,多种交换类型;
支持几乎所有最受欢迎的编程语言:Java,C,C ++,C#,Ruby,Perl,Python,PHP等等;
可以部署为高可用性和吞吐量的集群; 跨多个可用区域和区域进行联合;
可插入的身份验证,授权,支持TLS和LDAP。;
提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面;
提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
RabbitMQ提供了6种模式:
简单模式
work工作模式
publish/Subscribe发布与订阅模式
Routing路由模式
Topics主题模式
RPC远调用模式(远程调用,不太算MQ)
3
最后
今天就写到这,我打算把MQ中的各个技术选型从入门到项目中的实战用法全部一级一级分享给大家,一是防止自己以后忘记可以回来翻翻看,二是分享给大家有兴趣的朋友可以一起学习。
熟悉MQ的朋友,可能看下来解决写的东西很简单,但是毕竟也有很多人实际工作中并没有用过MQ,自己可能也没有了解过,对于没有了解过的朋友来说,我觉得入个门还是挺不错的。