使用场景
- 应用解耦合:应用之间不用直接调用,可以通过队列来传递消息,完成通信。
- 异步任务:队列可以用来执行异步任务,任务提交方无需等待结果。
- 削峰填谷:在突发流量时,可以通过队列做缓冲,不会对后端服务产生较大的压力,当峰值过去时,可以逐渐消费堆积的数据,来填平流量的低谷。
- 消息广播:一写多读
综上,消息队列主要有三个特点:解耦、异步、消峰,根据这三个特点来判断对应的应用场景。
消息协议
- JMS:是Java的消息服务,规定了Java使用消息服务的API,Spring提供了支持JMS的组件。
- AMQP:是高级消息队列协议,是应用层协议的开放标准,AMQP不从API层进行限定,而是直接定义网络交换的数据格式,因此支持跨语言的能力。
常用的消息队列
- RabbitMQ:支持AMQP、XMPP、SMPP等多种协议,比较重量级,单机吞吐量在万级。
- ActiveMQ:可以部署于代理模式和P2P模式,支持多种协议,单机吞吐量在万级,不够请求,队列较多的情况支持不是很好。有较低概率丢失消息。
- RocketMQ:单机支持10万级的吞吐量,使用Java开发,具有高吞吐量,高可用性的特点,适合在大规模分布式系统中应用。
- Kafka:高性能跨语言分布式消息队列,单机吞吐量可以达到10万级,消息延迟在毫秒级,kafka是完全的分布式系统,broker、producer、consumer都是原生自动支持分布式,依赖于zookeeper做分布式协调,kafka支持一写多读,消息可以被多个客户端消费,消息有可能会重复但是不会丢失。