消息队列基础总结
-
消息队列的含义:分布式系统中的重要组件,使用队列Queue与生产者-消费者模式
-
好处
-
异步处理提高系统性能(流量削锋,减少响应所需要的时间):
不适用消息队列的时候,用户请求的数据直接写入数据库,高并发压力大响应慢;使用消息队列以后,用户请求的数据发送给消息队列以后直接返回,消息队列的消费者进程从消息队列里面获取数据,异步写入数据库。消息队列服务器处理速度大于数据库,使得响应速度大幅度提高。
所以:异步处理,使得短时高并发产生的事务消息存储在消息队列里面,从而削平高峰时期的并发事务。
带来的问题:业务逻辑的改变
-
降低系统耦合性
使用发布订阅模式,生产者与消费者没有直接耦合,对于原有业务没有任何影响,实现业务的可拓展性。
-
-
实现基础:JMS(Java Message Service)API是一个消息服务的标准或者是规划。
-
JMS的两种消息模型:
- P2P模型:使用队列作为消息通信载体,满足生产者与消费者模式,一个消息只能被一个消费者使用
- 发布订阅模型:使用主题作为消息通信载体,类似于广播模式。在一条消息广播以后才订阅以后的用户是无法收到消息的
-
JMS的五种不同消息正文格式
- StreamMessage – Java原始值的数据流
- MapMessage–一套名称-值对
- TextMessage–一个字符串对象
- ObjectMessage–一个序列化的 Java对象
- BytesMessage–一个字节的数据流
-
AMQP(Advanced Message Queuing Protocol) 提供统一消息服务的应用层标准高级消息队列协议
-
ActiveMQ基于JMS实现,RabbitMQ基于AMQP协议实现
-
AMQP与JMS的区别:
- AMQP定义了线路层的协议,JMS定义的是API规范
- JMS支持多种复杂的消息类型,AMQP支持的byte[]消息类型,复杂类型可以序列化以后进行发送
-
常见几种消息队列比较
- ActiveMQ性能比较差,版本迭代比较慢
- RabbitMQ吞吐量比RocketMQ与kafka,但是基于erlang开发,并发能力强,性能极好,延时性很低,到达微秒级。
- RocketMQ是阿里出品,
- Kafka提供极少的核心功能,但是提供超高的吞吐量。ms级别延迟