消息中间件
消息中间件是指利用搞笑可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的继承。
通过提供消息传递和消息排列模型在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等功能。
大致过程如下:
发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题中,在合适的时候,消息服务器会将消息转发给接受者。在这个过程中,发送和接收是异步的,也就是发送无需等待,而且发送者和接收者的生命周期也没有必然关系;尤其是在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接收者。
ActiveMQ
是一种分布式消息中间件,APACHE出品,历史悠久,实现JMS规范。
什么是JMS
定义了两个应用程序或者分布式系统发送消息的API,与具体实现平台无关,即JAVA MESSAGE SERVICE。还定义一系列相关术语。
术语英文 | 术语中文 |
---|---|
ConnectionFactory | 连接工厂 |
Connection | 连接 |
Session | 会话 |
Destination | 目的地 |
MessageProducer | 消息生产者 |
MessageConsumer | 消息消费者 |
Message | 消息 |
Broker | 消息中间件事例(例如ActiveMQ) |
JMS定义了两种消息模型:
- 点对点Point-to-point,即一条消息对应一个生产者和一个消费者。
- 发布订阅Publish/Subscribe,生产者发布topic,多个订阅了该topic的消费者都可以获取该消息。
JMS定义了消息结构,包括消息头,消息属性和消息体。
- 消息头定义了消息的识别和消息的路由。
- 消息属性是除了1)之外开发者定义的业务属性。
- 消息体是具体的消息内容。
为什么要使用ActiveMQ
主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
RPC和消息中间件的不同很大程度上就是“依赖性”和“同步性”。RPC方式是典型的同步方式,让远程调用像本地调用。消息中间件方式属于异步方式。消息队列是系统级、模块级的通信。RPC是对象级、函数级通信。
消息中间件常常用于:
- 异步处理
- 应用解耦
- 流量削峰
- 日志处理
- 消息通讯。