消息中间件(Message-oriented middleware)是一类基础通信软件,它可以为分布式应用或者系统提供异步、松耦合、高可靠性、可扩展并且安全的通信功能。
这段话出自《ActiveMQ in Action》,算是对消息中间件比较准确的定义。虽然这句话只有不到两行,却很值得我们仔细分析。
1. 异步性
在分布式系统中,应用需要通过网络的方式协作。协作的典型方式就是通过RPC,RPC的实现方式有很多种,但有一点很确定——RPC是同步的。所谓的同步,是指请求返回时,请求的任务已经完成。区别于RPC这种同步的方式,消息中间件旨在实现一种异步的模式。看看下图就能发现消息中间件的异步特点。
异步模式与同步模式之间其实没有绝对的优劣,需要根据场景来讨论。比如在高并发的场景,由于同步模式的阻塞特性,可能会导致服务的可用性降低、甚至崩溃。如果使用异步的消息中间件,可以实现“消峰”的作用,从而实现服务的高可用。12306售票模式的不断改变,现在已经稳定为异步的模式。诚然,在一些分布式的事务性操作上,同步逻辑仍然是必要的。但是在多数场景,消息中间件都大有可为。
2. 松耦合
在软件领域,松耦合是一个非常吸引人的优点。为了解除不同模块之间的耦合,通常的方法就是添加中间层。中间层充当了胶水的作用,各个模块只需要维护与中间层的逻辑即可。单从代码可维护性、可扩展性的角度讲,使用消息中间件可以达到非常好的效果。
《大型网站系统与Java中间件实践》中,作者举了一个关于登录的例子。业务逻辑需要用户在登录完成之后,为用户发送推送短信,同时在安全系统中进行记录,甚至还需要给用户进行消息推送等功能。如果使用直接服务调用的方式,就会使得登陆系统的越来越臃肿,逻辑与其他服务紧密耦合在一起。如果要增加新的功能,需要改动的地方也会比较多。作为对比,贴出一张使用消息中间件的结构图。
使用消息中间件之后,可以提高系统的可维护性以及可扩展性。
3. 高可靠性
根据本人有限的理解,消息系统的高可靠性体现在两个个方面。首先,消息中间件使用数据库对消息进行持久化,因此很多消息中间件可以为消息投递做出一些可靠性保证。其次,很多消息中间件可以配置为分布式的模式(如Kafka和ActiveMQ),这种分布式模式本身就可以提高整个系统的可靠性。
4. 可扩展性
正如前文所述,消息中间件本身可以分布式部署,所以其本身具有比较强的扩展性。同时,使用消息中间件的架构本身也具有很好的可扩展性。
其原因其实简单,看上面这张图就能一目了然了。对于基于消息系统的架构来说,消息生产者与消费者的水平扩展非常简单,只是简单地增加消息队列的Publisher和Subscriber而已。考虑到业务规模不确定的变化,系统的可扩展性其实是非常重要的,毕竟大家都害怕“重构火葬场”。
对于安全性的问题,我其实也没有什么细致的理解,这里就作罢了。
发表评论