此公众号会从消息中间件的一些概念出发,陆续介绍分布式消息中间件的应用领域,涉及的技术等,最后到自己设计和实现一个分布式消息中间件。
第一次写公众号,文章的结构组织并不一定能足够清晰,文字表达不一定够准确,权当和大家的讨论交流。下面进入正题。
什么是分布式消息中间件?
对于分布式消息中间件,首先要了解两个基础的概念,即什么是分布式系统,什么又是中间件。
分布式系统
“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.”——维基百科
维基百科给出的消息中间件的定义是支持在分布式系统中发送和接受消息的硬件或软件基础设施(对我们这里讨论的范围来说肯定就是软件了)。
那么分布式消息中间件其实就是指消息中间件本身也是一个分布式系统。
消息中间件能做什么?
任何中间件必然都是要去解决特定领域的某个问题,消息中间件解决的就是分布式系统之间消息传递的问题。消息传递是分布式系统必然要面对的一个问题。
假设一个电商交易的场景,用户下单之后调用库存系统减库存,然后需要调用物流系统进行发货,如果交易、库存、物流是属于一个系统的,那么就是接口调用。但是随着系统的发展,各个模块越来越庞大、业务逻辑越来越复杂,必然是要做服务化和业务拆分的。这个时候就需要考虑这些系统之间如何交互,第一反应就是RPC(Remote Procedure Call)。系统继续发展,可能一笔交易后续需要调用几十个接口来执行业务,比如还有风控系统、短信服务等等。这个时候就需要消息中间件登场来解决问题了。
笔者认为,RPC和消息中间件的场景的差异很大程度上在于就是“依赖”和“量”。比如短信通知服务并不是事交易环节必须的,并不影响下单流程,不是强依赖,所以交易系统不应该依赖短信服务。比如一些数据分析程序可能需要在拿到一天的总销售量,这个就只需要销售中心提供接口在需要时调用即可。
消息中间件出现以后对于交易场景可能是调用库存中心等强依赖系统执行业务,之后发布一条消息(这条消息存储于消息中间件中)。像是短信通知服务、数据统计服务等等都是依赖于消息中间件去消费这条消息来完成自己的业务逻辑。
从以上的场景可以看出消息中间件其实就是对系统进行了解耦,同时带来了异步化等好处。
简单概括一下消息中间件的应用场景大致如下:
分布式消息中间件长什么样?
一个抽象的对分布式消息中间件的认知大概是这样:
结语
至此应该对分布式消息中间件应该有了一个简单的认识。下一篇将介绍分布式消息中间件内部的一些概念和专业术语,比如什么是集群消费,什么是广播消费,什么是Topic、什么又是Broker?