相关文章参考:

1.关于消息队列

消息队列,外文名Message Queue,简称MQ,是指在消息的传输中保存消息的容器或服务。

消息队列,是分布式系统实现高性能、高可用、可伸缩等高级特效的重要组件,适用多种场景,如:消息通讯、异步处理、应用解耦、流量削峰等等。

常见的主流消息队列:ActiveMQ、RabbitMQ、RocketMQ和Kafka。

2.应用场景

2.1.消息通讯

作为消息队列,其本职场景就是实现消息通讯

应用举例:微信单人发消息、QQ聊天群等。

消息队列主要有两种模式:点对点(Point to Point)模式和发布-订阅(Publisher-Subscriber)模式。

点对点模式:

  • 参与者:消息发送者被称为生产者(Producer),消息容器被称之为队列(queue)、消息接收者被称之为消费者(Consumer)。
  • 每个消息只有一个消费者,一旦被消费,则从队列中移除。
  • 为了让队列移除消息,消费者在消费之后,应该给予队列应答(ACK)。

发布-订阅模式:

  • 参与者:消息发送者被称为发布者(Publisher),消息容器被称之为话题(topic)、消息接收者被称之为订阅者(Consumer)。
  • 每个消息可有多个订阅者,即使被消费,依然在队列中存在。
  • 为了能消费指定话题的消息,订阅者需要订阅该topic;如果不在需要消费其消息,则取消订阅该topic。

2.2.异步处理

有时一个操作会涉及多步处理,如果全部同步处理,则耗时很长。

此时,可以将[非关键性业务需要处理]作为消息发送给MQ,然后直接返回操作结果,节省这些业务处理上的耗时。

然后,再通过其他服务异步的消费MQ中的消息,进行非关键性业务的处理。

优点:减低响应时间,提高性能和吞吐量。

应用举例:会员注册之后的短信通知、网站站内信等。

以下图为例:

  • 同步处理:注册流程共耗时=保存用户50ms+短信通知50ms=100ms
  • 异步处理:注册流程共耗时=保存用户50ms+发送消息5ms=55ms

2.3.应用解耦

有时一个操作会涉及多个服务,如果其中一个服务挂掉,则整个操作不可用。

此时,可以将[非关键性业务需要处理]作为消息发送给MQ,然后直接返回操作结果,无需在意这些业务是否处理成功。

然后,再通过其他服务异步的消费MQ中的消息,进行非关键性业务的处理。

优点:降低应用耦合性,提升服务可用性和稳定性。

以下图为例

  • 应用耦合的情况下,如果短信服务发送故障,则整个注册功能都将不可用。
  • 应用解耦的情况下,即使短信服务发送故障,注册功能也能继续提供服务。

2.4.流量削峰

在秒杀场景,由于峰值访问量过大,超出服务能力,则会压垮服务,导致服务崩溃。

此时,可以先将用户的秒杀请求作为消息存入MQ,然后服务再根据自身能力慢慢处理这些请求。

优点:提示峰值处理能力,提示服务稳定性。

应用举例:秒杀活动、团购抢单等。

以下图为例

  • 未削峰:秒杀请求峰值为5k,而订单服务的最大吞吐量只有2k,这种情况下定会压垮订单服务。
  • 削峰:秒杀请求峰值为5k,MQ的最大吞吐量为100k,处理这些请求绰绰有余;订单服务以2k的速度处理MQ中的请求,服务不会崩溃。

3.常见消息队列及对比

常见消息队列如下:

  • RabbitMQ:使用Erlang编写的开源消息队列,在AMQP(高级消息队列协议)基础上完成的,以高性能、健壮以及可伸缩性出名,非常重量级,多用于企业级开发。
  • ActiveMQ:Apache软件基金会所研发的开源消息队列,使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
  • RocketMQ:阿里巴巴的开源消息队列,用 Java 语言实现,在设计时参考了 Kafka。
  • Kafka:Apache软件基金会的开源消息队列,由Scala和Java编写。

常见消息队列对比如下(来源于网络,仅供参考):

对比内容RabbitMQActiveMQRocketMQKafka
所属机构/公司GoPivotalApacheAlibabaApache
是否开源开源开源开源开源
技术文档完备
快速入门提供提供提供提供
成熟度成熟成熟成熟成熟
数据可靠性可靠可靠可靠可靠
集群支持支持支持支持
负载均衡支持支持支持支持
部署方式独立独立独立独立
客户端支持语言多种多种多种多种
开发语言ErLangJavaJavaScala && Java
批量操作不支持支持支持支持
有序性支持单客户端有序支持支持支持
管理界面较好一般命令行界面命令行界面
消息延时微秒级微秒级毫秒级毫秒级
事务支持不支持支持支持不支持
社区活跃度
商业支持阿里云
协议支持AMQP等多种AMQP等多种自定义协议自有协议,HTTP
消息丢失概率
可用性主从主从分布式分布式
单机吞吐量万级万级十万级十万级
部署难度
持久化内存、文件,数据堆积影响效率内存、文件、数据库磁盘磁盘,无限数据堆积
消费方式push/pullpush/pullpush/pullpull
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐