消息队列简介
消息队列
1. 消息队列介绍
1.1. 什么是消息队列(Message Queue)?
消息队列是在消息的传输过程中保存的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由以保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功的传递为止。
消息队列在电商系统、消息通讯、日志收集等应用中扮演着关键作用,以阿里为例,其研发的消息队列(MQ)服务于阿里集团超过11年,在历次天猫双十一活动中支撑了万亿级的数据洪峰,为大规模交易提供了有力保障。
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋,日志处理等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。
应用场景:http://blog.csdn.net/shaobingj126/article/details/50585035
http://www.cnblogs.com/itfly8/p/5155983.html
1.2. JMS介绍
http://blog.csdn.net/jiuqiyuliang/article/details/46701559
http://blog.csdn.net/jiuqiyuliang/article/details/47160259
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持
JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。
1.3. jms消息传递模式
JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。
1.3.1 点对点:Queue,不可重复消费
消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。这种消息传递模型是传统意义上的拉模型或轮询模型。在此列模型中,消息不时自动推动给客户端的,而是要由客户端从队列中请求获得。
特点:
- 每条消息只能被一个接收者接收。
- 每条消息都会被接收者从队列中取走,或者被JMS提供者在超时的情况下删除。
- 消息产生时接收者不一定要存在,接收者可以在消息产生后的任何时候(过期时间内)取走消息。
- 接收者不能请求一个消息。
- 接收者必须在收到消息后发出确认信息。
1.3.2 发布/订阅:Topic,可以重复消费
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被多个订阅者消费。
特点:
- 每条消息由一个发布者创建而由0个或多个订阅者接收它。
- 消息立即被分发给现有的订阅者。
- 订阅者必须在消息发送的时候存在以接收消息。
- 持久订阅允许订阅者接收它处于非活动状态时由发布者向主题发送的消息。
- 订阅者必须在接收到消息后发出确认信息。
1.4. JMS消息的组成。
http://boy00fly.iteye.com/blog/1103586
1. 头(head)
每条JMS 消息都必须具有消息头。头字段包含用于路由和识别消息的值。可以通过多种方式来设置消息头的值:
a. 由JMS 提供者在生成或传送消息的过程中自动设置
b. 由生产者客户机通过在创建消息生产者时指定的设置进行设置
c. 由生产者客户机逐一对各条消息进行设置
2. 属性(property)
消息可以包含称作属性的可选头字段。他们是以属性名和属性值对的形式制定的。可以将属性是为消息头得扩展,其中可以包括如下信息:创建数据的进程、数据的创建时间以及每条数据的结构。JMS提供者也可以添加影响消息处理的属性,如是否应压缩消息或如何在消息生命周期结束时废弃消息。
3. 主体(body)
包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口。
StreamMessage 一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
MapMessage 一种主体中包含一组键--值对的消息。没有定义条目顺序。
TextMessage 一种主体中包含Java字符串的消息(例如,XML消息)。
ObjectMessage 一种主体中包含序列化Java对象的消息。
BytesMessage 一种主体中包含连续字节流的消息。