我们测试同学在实际工作中或多或少都会接触过ActiveMQ、RabbitMQ,Kafka,和RocketMQ这类消息中间件产品,不同的公司会选择不同的产品,大家可能会觉得产品比较多,了解起来有些复杂!其实无论使用哪种中间件产品,他们的核心功能都是比较类似的。本文就不来汇总一下中间件产品的核心概念,给大家在实际工作中提供理论依据,帮助大家快速上手具体工作。
消息中间件和JMS概述
消息队列(消息中间件)已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如ActiveMQ、RabbitMQ,Kafka,和RocketMQ等。
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,实际上是一套api,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,消息中间件是这个规范的一个具体实现,ActiveMQ就实现了JMS。
消息中间件的核心概念
我们在实际工作中无论使用哪种中间件:ActiveMQ、RabbitMQ或者Kafka,他们在某些功能的实现上会有所区别,但是下面总结的这些核心概念都是一致的,只要大家先理解了这些概念,再上手不同的中间件就都会有的放矢啦!
Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
Broker
消息中间件服务器,作为server提供消息核心服务
Producer
消息生产者,业务的发起方,负责生产消息传输给broker,
Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
Topic
主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播
Queue
队列,点到点模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
Destination
消息发送的目的地,上面说的queue和topic
点对点模式
点对点模型是基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能,一个生产者对应一个消费者,当没有消费者可用时,这个消息会被保存直到有 一个可用的消费者,所以Queue实现了一个可靠的负载均衡。
发布/订阅模式
Pub/Sub发布订阅(广播):使用topic作为通信载体 ,topic可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe)从主题订阅消息。主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送。一个发布者可以对应多个订阅者,当发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。
消息持久化
通过消息持久化可以保证消息的可靠性。简单来说就是将数据存入磁盘,而不是存在内存中,这样会导致随服务器重启断开而消失。持久化带来的问题是性能低,写入硬盘要比写入内存性能较低很多,从而降低了消息中间件服务器的吞吐量。至于是否选择将消息进行持久化处理,要根据业务的实际情况自行判断。
消息高可用
当业务量增加请求也过大时,一台消息中间件服务器的会触及硬件(cpu、内存、磁盘)的极限,一台消息服务器已无法满足业务的需求,故消息中间件必须支持集群部署,来达到高可用的目的。