消息中间件原理介绍

这几年身边的同事,总是专心于消息中间件的研究。也不知道为什么,这个就莫名其妙的火起来了,现实工作中,我想90%的系统是不需要消息中间件的。只有那些信息量巨大的分布式系统,并且对客户体验实时性很高的系统才会用到。

废话不多说了,毕竟也是一门技能,简单介绍一下吧。

1、首先,我们必须明白什么是消息中间件:

消息中间件MOM(Message Oriented Middleware)是在分布式环境中,两个或多个独立运行的系统之间,提供消息通讯作用的中介。

2、消息中间件的作用:

消息中间件的作用:把各个系统之间服务的调用以消息通讯的方式交互

3、消息中间件的特点:

a、消息异步接收,消息发送者不需要等待消息接收着的响应,提高整个应用程序的性能
b、消息可靠接收:消息发送出去后保存在一个中间容器内,只有消息接收者收到消息后才删除消息

4、消息中间件的应用场景

在多个系统间进行通讯的时候,通常会要求:
(1)可靠传输,数据不能丢,有的时候,也会要求不能重复传输
(2)异步传输,否则各个系统同步发送接收数据,相互等待,造成系统性能低下

5、比较流行的消息中间件:

收费:IBM MQSeries,BEA WebLogic JMS Server,Oracle AQ
开源:ActiveMQ,RocketMQ,Kafka

以上是消息中间件的一些常识问题:

那么说到消息中间件不得不提的就是JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是JavaEE平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

JMS规范
JMS定义了Java中访问消息中间件的接口,并没有给予实现,实现JSM接口的消息中间件称为JMS Provider,例如ActiveMQ

所以我们常用的RocketMQ等之类的消息中间件,就是实现了JSM接口的JMS Provider

如下,解释JMS常用的几个概念:

1、JMS Provider:实现JMS接口和规范的消息中间件
2、JMS Message:JMS消息,分3个部分:
(1)消息头:每个消息头字段都有相应的getter和setter方法
(2)消息属性:如果需要除消息头字段以外的值,那么可以使用消息属性
(3)消息体:封装具体的消息数据
3、JMS Producer:消息生产者,创建和发送JMS消息的客户端应用
4、JMS Consumer:消息消费者,接收和处理JMS消息的客户端应用
5、JMS Domain:消息传递域,JMS规范中定义了两种消息传递域:
(1)点对点(point-to-point,简写PTP或P2P)消息传递域,该消息传递域发送的消息目的地称为队列(queue)
        特点:
        a、每个消息只能有一个消费者
        b、消息的生产者和消费者之间没有时间上的相关性,无论消息消费者在提取消息的时候,消息生产者是否处于运行状态,消息消费者还是可以提取消息
        
(2)发布/订阅(publish/subscribe,简写pub/sub)消息传递域,该消息传递域发送的消息目的地称为主题(topic)
        特点:
        a、每个消息可以有多个消费者
        b、生产者和消费者之间有时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。
             

JMS的这种模式呢,我们可以类比,类比JDBC链接数据库驱动。

JDBC的意义:它是一种规范,设计出来的主要目的是为了让各个数据库开发商为Java程序员提供标准的数据访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但是应用程序不变) Java设计规范接口,各大数据库产商遵守规范实现,Java程序员不需要考虑实现细节,只需要调用API即可。

JDBC API (统一的应用接口) JDBC Driver Manager(驱动程序管理器) JDBC 数据库驱动程序 驱动本质就是一个Java类,这个类实现了JavaAPI定义的接口 一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。这里所谓的驱动,其实就是实现了java.sql.Driver接口的类

类比,JMS也是只一种规范,实现了这种规范的中间件如:ActiveMQ,RocketMQ,Kafka等,我们直接用即可。

补充下,上面这个图的问题点:RocketMQ没有实现JMS协议,只是实现类似协议。图有错误。

猜你喜欢

转载自blog.csdn.net/LB_Captain/article/details/108431945
今日推荐