消息中间件概述
1.什么是中间件?
非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给用户带来价值的软件系统称为中间件。
2.什么是消息中间件?
关注于数据的发送与接收,利用高校可靠的异步消息传递机制集成分布式系统。图示如下:
当然MQ还可以用于dubbo服务间解耦。
也可以用于异步执行任务。比如说12306抢票,将所有的请求信息存入MQ中,由于MQ本身是有顺序的队列,所以可以根据入队的顺序进行处理。
3.什么是JMS?
Java消息服务(message service)即是JMS,是一个Java平台关于面向消息中间件的API,用于在两个程序间或分布式应用系统之间发送消息,进行异步通信。
4.什么是AMQP?
AMQP(Advanced message queuing protocol)是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端、中间件等不同产品,不同开发语言等条件的限制。
5.JMS与AMQP对比
6.常见消息中间件对比
7.JMS规范
JMS相关概念:
提供者:实现JMS规范的消息中间件服务器
客户端:发送或者接受消息的应用程序
生产者/发布者:创建并发送消息的客户端
消息者/订阅者:接受并处理消息的客户端。
消息:应用程序之间传递的数据内容
消息模式:在客户端之间消息传递的方式,JMS定义了主题和队列两种模式
7.1消息模式-队列模型 (这个可以理解为P2P--point to point模式)
客户端包括生产者和消费者
队列中的消息只能被一个消费者消费
消费者可以随时消费队列中的消息(可以不用预先预定此消息)
特点:
(1)每条消息只能有一个接收者,一个队列可以有多个消费者。
(2)发送者和接收者之间可以异步(no timing dependencies)。消息的生产者和消费者之间没有时间上的相对性。无论消费者在生产者发送消息的时候是否处于运行状态,它都可以提取消息。
(3)接收者成功接收答复机制
7.2消息模式-主题模式
客户端包括发布者和订阅者
主题中的消息被所有订阅者消费
消费者不能消费订阅之前就发送到主题中的消息
·
(图中需要订阅者先订阅主题,然后发布者发布消息,因为订阅所有不能消费订阅之前就发送的消息)
特点:
A、一条消息可以有多个接收者接收
B、接收者和发送者之间必须同步。
为了弥补这种类型的时间依赖(timing dependencies)劣势,JMS API 提供了创建持久订阅的机制,这样不管接收者是否在线,发送者都可以发送,接收者也可以接收
7.3JMS编码接口
ConnectonFactory:用于创建连接到消息中间件的连接工厂
Connection:代表了应用程序和消息服务器之间的通信链路
Destination:指消息发布和接收的地点,包括队列和主题
Session:表示一个单线程的上下文,用于发送和接收消息
MessageConsumer:由Session创建,用于接收到发送到目标的消息
MessageProducer:由Session创建,用于发送消息到目标
Message:是在生产者和消费者之间传送的对象,由消息头(必须存在)、一组消息属性和一个消息体组成。
7.4JMS编码接口之间的关系
Connection是可以被多个线程共享的,一个Connection创建多个Session,每个Session属于一个线程上下文。也就是Connection可被其他线程共享,而Session是单线程的,只在当前上下文有效,可以进行一些事务操作。Session也可以创建消息。
8 JMS的消息结构
JMS由下面三部分组成:消息头、属性、消息体
1.消息头 : 包含消息的识别信息和路由信息,消息头包含一些标准的属性如下:
2.消息体:
JMS定义的五种类型的消息体格式,也叫消息类型,包括:TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessage等五种
3.消息属性
包含下面三种类型的消息属性:
-
应用程序设置和添加的属性,如下:
MapMessage mapMessage = session.createMapMessage();
mapMessage.setStringProperty("strPro","string");
- JMS定义的属性
使用"JMSX"作为属性名的前缀。如下方法可以返回所有连接支持的JMSX属性的名字。
connection.getMetaData().getJMSXPropertyNames();
- JMS供应商特定的属性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-09-18 心跳机制
2017-09-18 基于Socket创建Web服务
2017-09-18 socket介绍(webService适用场景)
2017-09-18 JDBC连接池&DBUtils使用
2017-09-18 DBCP连接池与c3p0连接池
2017-09-18 Spring整合JDBC
2017-09-18 Spring中的aop思想(面向切面编程)