对于分布式消息中间件,首先要了解两个基础的概念,即什么是分布式系统,什么又是中间件。spring
分布式系统:性能优化
“A distributed system is one in which components located at networked
computers communicate and coordinate their actions only by passing
messasges.”——《Distributed Systems Concepts and Design》
从上面这个解释能够获得分布式系统的两个特色:服务器
中间件:微信
Middleware is computer software that provides services to software
applications beyond those available from the operating system. It can
be described as "software glue". Middleware makes it easier for
software developers to implement communication and input/output, so
they can focus on the specific purpose of their application.——维基百科
中间件被描述为为应用程序提供操做系统所提供的服务以外的服务,简化应用程序的通讯、输入输出的开发,使他们专一于本身的业务逻辑。网络
从维基百科上对中间件的解释感受有点绕,其实能够从“空间”的角度去理解中间件,即中间件是处于“中间层”的组件,是上层的应用程序和底层的服务之间的桥梁(好比DB中间件的上层是应用程序,底层是DB服务),也是应用与应用之间的桥梁(好比分布式服务组件)。数据结构
分布式消息中间件:架构
“Message-oriented middleware (MOM) is software or hardware
infrastructure supporting sending and receiving messages between
distributed systems.”——维基百科
维基百科给出的消息中间件的定义是支持在分布式系统中发送和接受消息的硬件或软件基础设施(对咱们这里讨论的范围来讲确定就是软件了)。并发
那么分布式消息中间件其实就是指消息中间件自己也是一个分布式系统。app
消息中间件就是能够省去繁琐的步骤,直达目的,怎么讲呢,就是好比你想不少人,知道你的动态,而知道的人可能手机没电,可能手机信号很差,可能手机不在服务区,或者看的人比较忙,看的时间不固定,这样的时候,你发送的消息怎么会让其看到呢,就是创建一个微信公众号,能够知足用户随时看到你想让其看到的消息,这就是中间件的一种应用方式,生活中老师讲课的黑板,家中的电视机都是中间件的一种体现方式。异步
任何中间件必然都是要去解决特定领域的某个问题,消息中间件解决的就是分布式系统之间消息传递的问题。消息传递是分布式系统必然要面对的一个问题。
假设一个电商交易的场景,用户下单以后调用库存系统减库存,而后须要调用物流系统进行发货,若是交易、库存、物流是属于一个系统的,那么就是接口调用。可是随着系统的发展,各个模块愈来愈庞大、业务逻辑愈来愈复杂,必然是要作服务化和业务拆分的。这个时候就须要考虑这些系统之间如何交互,第一反应就是RPC(Remote Procedure Call)。系统继续发展,可能一笔交易后续须要调用几十个接口来执行业务,好比还有风控系统、短信服务等等。这个时候就须要消息中间件登场来解决问题了。
笔者认为,RPC和消息中间件的场景的差别很大程度上在于就是“依赖”和“量”。好比短信通知服务并非事交易环节必须的,并不影响下单流程,不是强依赖,因此交易系统不该该依赖短信服务。好比一些数据分析程序可能须要在拿到一天的总销售量,这个就只须要销售中心提供接口在须要时调用便可。
消息中间件出现之后对于交易场景多是调用库存中心等强依赖系统执行业务,以后发布一条消息(这条消息存储于消息中间件中)。像是短信通知服务、数据统计服务等等都是依赖于消息中间件去消费这条消息来完成本身的业务逻辑。
从以上的场景能够看出消息中间件其实就是对系统进行了解耦,同时带来了异步化等好处。
简单归纳一下消息中间件的应用场景大体以下:
一个抽象的对分布式消息中间件的认知大概是这样:
一、ActiveMQ
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线. ActiveMQ是一个彻底支持JMS1.1和J2EE1.4规范的JMS Provider实现,尽管JMS规范出台已是好久的事情了,可是JMS在当今的J2EE应用中间仍然扮演着特殊的地位.
ActiveMQ特性
(1)多种语言和协议编写客户端.语言:Java,C,C++,C#,Ruby,Perl,Python,PHP.
(2)应用协议:OpenWire、Stomp REST,WS Notification,XMPP,AMQP
(3)彻底支持JMS1.1和J2EE1.4规范(持久化,XA消息,事务)
(4)虚拟主题、组合目的、镜像队列
二、RabbitMQ
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ特性
(1)支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript等
(2)AMQP的完整实现(vhost、Exchange、Binding、Routing Key 等)
(3)事务支持/发布确认
(4)消息持久化
三、Kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,是一个分布式的、分区的、可靠的分布式日志存储服务。它经过一种独一无二的设计提供了一个消息系统的功能。(不是个严格的中间件,主要是用于日志转存的)
Kafka特性:
(1)经过O(1) 的磁盘数据结构提供消息的持久化,这种结构对于即便数以TB的消息存储也可以保持长时间的稳定性能。
(2)高吞吐量:即便是很是普通的硬件Kafka也能够支持每秒数百万的消息。
(3)Partition、Consumer Group
消息中间件综合对比
若是你们想学习如下路线内容,在此我向你们推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
注:关注做者微信公众号,了解更多分布式架构、微服务、netty、MySQL、spring、、性能优化、等知识点。公众号:《Java烂猪皮》