工作这几年,在公司里遇到了几款消息中间件,当然没有参与过其中的开发,只是拿来用,没有深入底层原理细节,所以难免有些遗憾。不过最近又看了有关RabbitMq方面的介绍,还是想对消息中间件做一个初步的总结,后续深入之后再回头总结
消息中间件。
顾名思义传递消息的一个工具
为什么要使用消息中间件,消息中间件有那些类型?
自己理解,消息的传递无非就是发送方和消费方,即producer,consumer。如果二者属于同一套系统,那么压根就谈不上消息这么一说,直接通过本地接口调用就行。所以消息的传递是建立在起码至少两套系统之上(当然包括两套)。
两套系统之间的通信是通过消息来传递,现在有一个问题就是,我们要和对方系统进行通信,最初我们会去想对方系统是用啥语言开发的?然后怎么交互,比如消息体是用什么格式去推送?是否需要同步返回?还是异步推送?是以多大的量去发送?传输协议是基于TCP或者HTTP?是否支持幂等机制?消费消息的能力又如何,是否需要限流……一堆的问题。当然如果只有两套系统,而且数据量又特别小的时候,应该说怎么玩都行。如果系统比较多,并且数据量又很大,有需要实时的报文日志追踪。那么这个时候系统的交互似乎会变得很复杂。
所以在一些大的公司比如阿里等,会有专门的团队,用来解决上千套系统的交互,这个交互系统就是消息中间件,对消息的高效、安全传递进行统一,集中式的管理。
消息中间件目前开源的比较多比如阿里的RocketMq,以及要分享的RabbitMq,以及ESB,RSF,WindQ后两者是公司自研的,总的来说还是极大的方便了系统之间的消息传递
进入正题,RabbitMq有哪些优势?
开源,稳定,集群模式丰富(支持配置,多活),满足高可用等
交换机基于Erlang语言进行开发的,而RabbitMq本身引用了交换机的特性,通信速度快,所以其采用了Erlang语言开发的,并且遵循AMQP(高级消息队列)协议
AMQP协议模型
这幅图是从网上找的,大致的意思就是生产方发送消息到服务器,服务器再到指定的虚拟主机,虚拟主机再发送给交换机,交换机再到消息队列,消费方侦听消息结束。
RabbitMq架构图
因为遵循AMQP协议,所以模型架构也是基本相似,上图大致意思是,生产方发送消息到broker,然后broker再指定到对应的exchange(交换机),交换机再通过绑定标志(RourtingKey)找到对应的对列,将消息push进去,再等候消费方侦听消费
综上所属,看其原理模型图,其实比较简单,根据自己用过的消息中间件,原理应该大致相似。使用消息中间件还有一个好处就是起到一个“削峰”的作用,其实在数据量特别大的时候,越能发现其魅力,比如在某一时刻,当大批量的数据下来时,下游系统因为某方面原因,一下消费不了那么多,这时候消息中间件可以帮助我们先进行数据的持久化,缓冲下来,再根据下游系统的消费能力适当的限流,以免造成雪崩效应,造成用户体验不友好等。相反,RabbitMq通过提供相应的API,为我们的系统通信保驾护航……
未完待续……