消息队列深入解析

“消息队列”(Message queue)是在消息的传输过程中保存消息的容器

消息队列深入解析

消息队列和消息

“消息队列”(Message queue)是在消息的传输过程中保存消息的容器
“消息” 是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。

常见的消息队列有那些?

当前使用较多的消息队列有RabbitMQActiveMQRocketMQKafka等等,
redis数据库也可以实现消息队列,不过不推荐,redis本身设计就不是用来做消息队列的。

使用消息队列的场景和好处

通过异步处理提高系统性能

在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。
但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即 返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。
由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。

通过以上分析我们可以得出消息队列具有很好的削峰作用的功能——即通过异步处理,
将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。

因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。
因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,
比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,
需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,
以免交易纠纷。这就类似我们平时手机订火车票和电影票。

降低系统耦合性

我们知道模块分布式部署以后聚合方式通常有两种:1.分布式消息队列和2.分布式服务

  • 分布式服务:

目前使用比较多的用来构建SOA(Service Oriented Architecture面向服务体系结构)的分布式服务框架是阿里巴巴开源的Dubbo.
《高性能优秀的服务框架-dubbo介绍》

  • 分布式消息队列:

我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。

我们最常见的事件驱动架构类似生产者消费者模式,在大型网站中通常用利用消息队列实现事件驱动结构。

常见的消息队列介绍

ActiveMQ

官网:activemq.apache.org/

特点:

  1. 支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议
  2. 完全支持JMS客户端和Message Broker中的企业集成模式
  3. 支持许多高级功能,如消息组,虚拟目标,通配符和复合目标
  4. 完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息
  5. Spring支持,以便ActiveMQ可以轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置
  6. 专为高性能集群,客户端 - 服务器,基于对等的通信而设计
  7. CXF和Axis支持,以便ActiveMQ可以轻松地放入这些Web服务堆栈中以提供可靠的消息传递
  8. 可以用作内存JMS提供程序,非常适合单元测试JMS
  9. 支持可插拔传输协议,例如in-VM,TCP,SSL,NIO,UDP,多播,JGroups和JXTA传输
  10. 使用JDBC和高性能日志支持非常快速的持久性

RabbitMQ

官网:www.rabbitmq.com/

特点:

  1. 异步消息传递:支持多种消息协议,消息队列,传送确认,灵活的路由到队列,多种交换类型;
  2. 支持几乎所有最受欢迎的编程语言:Java,C,C ++,C#,Ruby,Perl,Python,PHP等等;
  3. 可以部署为高可用性和吞吐量的集群; 跨多个可用区域和区域进行联合;
  4. 可插入的身份验证,授权,支持TLS和LDAP。
  5. 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面;
  6. 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

Kafka

官网:kafka.apache.org/

特点:

  1. 同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
  2. 可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。
  3. 分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
  4. 消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
  5. 支持online和offline的场景。

RocketMQ

官网:rocketmq.apache.org/

特点:

  1. 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
  2. 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递
  3. 支持拉(pull)和推(push)两种消息模式
  4. 单一队列百万消息的堆积能力
  5. 支持多种消息协议,如 JMS、MQTT 等
  6. 分布式高可用的部署架构,满足至少一次消息传递语义
  7. 提供 docker 镜像用于隔离测试和云集群部署
  8. 提供配置、指标和监控等功能丰富的 Dashboard

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :