消息中间件 概览及JMS-AMQP简介

  随着软件规模的日志增大,系统架构的进化,以及微服务的盛行,系统逐渐业务单一化、网络架构网状化,系统架构复杂化。各个系统间通讯变的尤为重要,保证系统可用性、一致性、稳定性,称为亟待解决问题。消息中间件,无论是JMS亦或是AMQP所代表的新一代消息中间件,都是旨在解决这些问题。消息中间件旨在利用高效可靠的消息传递机制提高系统间通信。

  消息中间件解决问题:

  1.应用解耦

  对于存在多系统的复杂应用来说,将各系统间通信由同步转换为异步,减少单一系统故障导致的故障传递等,进而提供整个系统可用性。

  2.流量削峰

  近年电商平台组织的全民购物节,每逢618、双十一、双十二,流量便会瞬间激增。流量风暴对于大部分应用来说,在没有缓冲机制的情况下,都可能是灾难性的。通过消息队列,把大量消息暂存起来,分散到相对较长的时间处理,可提高系统可用性。

  3.消息分发

  根据互联网统计数据显示,现阶段互联网数据在呈几何级数增长,对于任何应用系统来说,数据的收集、传输、分析、画像都可能成为必要的一环,此时,可持久化的消息队列显得尤为重要,例如通过ELK日志分析系统,进行用户行为、系统可用性分析。

  总体来说,消息服务分为两种:JMS和AQMP,JMS是2002年发布的1.1版本,即我们现在常用的API版本,正式统一了各厂商纷繁各异的API。由于JMS存在只允许基于Java实现的消息平台之间通信、生产者和消费者必须制定Queue或Topic等等局限性,AMQP横空出世,AQMP是一个高级消息队列,旨在实现一种在全行业广泛使用的标准消息中间件,以便降低企业和系统集成的开销。

  JMS(Java Message Service)消息服务定义了访问Java消息中间件的接口。JMS是一种与厂商无关的Java API,JMS与JDBC类似,每个厂商都可根据自身需求实现JMS接口,不同厂商间可使用统一接口进行通信。JMS提供了异构集成、可伸缩性、缓解系统瓶颈、并发处理、以及整体体系结构灵活性和敏捷性等。

  JMS包含如下角色:

  · JMS Server:实现了JMS标准接口的生产商,如ActiveMQ。

  · JMS Client:使用JMS协议发送和接收消息的应用。

  · JMS Producer/Publisher:消息生产者。

  · JMS Consumer/Subscrber:消息消费者。

  · JMS Queue/Topic:存放消息的容器,Queue以点对点方式进行通信,Topic以发布/订阅方式进行通信。

​  消息模型:

  · P-To-P:基于队列Queue进行通信,队列可以存在多个生产者,但是对一条消息只能存在一个消费者,且只能被消费一次。

  · Pub/Sub:基于主题Topic进行通信,主题可以存在多个生产者(发布),一条消息可同时有多个消费者(订阅)。

  消息类型:

​  · TextMessage:字符串作为有效载体。

  · MapMessage:键值对作为有效载体。

  · BytesMessage:字节流作为有效载体。

​  · StreamMessage:流信息作为有效载体。

  · ObjectMessage:对象作为有效载体。

  · Message:没有消息体,只有消息头和属性。

  AMQP(Advanced Message Queuing Protocol),一种提供统一消息服务的应用层标准高级消息队列协议。JMS与AMQP的区别在于,JMS定义了应用层接口,使用语言限定在Java语言内,AMQP实际定义的是交换的数据格式,因此AMQP具有跨平台、跨语言特性。

  AMQP包含如下角色:

  · Provider:消息生产者,与JMS不同的是,Provider不与Queue进行通信,而是将消息直接发送给Exchange。

  · Exchange:消息模型,

  · Binding:绑定器,将消息模型与Queue队列绑定在一起。

  · Queue:消息队列,用于存储通信消息。

  · Consumer:消息消费者,直接从Queue中消费消息。同时,Consumer负责Exchange与Queue的Binding。

  消息模型:

  · direct exchange:直连交换机。

  · fanout exchange:扇形交换机。

  · topic exchange:主题交换机。

  · headers exchange:头交换机。

  · system exchange:系统交换机。

​  消息类型:

  · byte[]:AMQP只提供一种消息类型,在实际应用时,对于不用类型需要传输的数据,生产者可以序列化为byte[]类型进行传输,消费者进行反序列化后处理。

猜你喜欢

转载自blog.csdn.net/securitit/article/details/106653914