why using mq?

为什么要使用消息队列?

使用消息队列的主要目的主要记住这几个关键词:解耦 、异步、削峰填谷

解耦:在一个复杂的系统中,不同的模块或服务之间可能需要相互依赖,如果直接函数调用或者API调用的方式,会造成模块之间的耦合,当其中一个模块发生改变时,需要同时修改调用方和被调用方的代码。而使用消息队列作为中间件,不同的模块可以将消息发送到消息队列中,不需要知道具体的接收方是谁,接收方可以独立地消费消息,实现了模块之间的解耦。

异步:有些操作比较耗时,例如发送邮件、生成报表等,如果使用同步的方式处理,会阻塞主线程或者进程,导致系统的性能下降,而使用消息队列,可以将这些操作封装成消息,放入消息队列中,异步地处理这些操作,不影响主流程的执行,提高了系统的性能和响应速度。

削峰填谷:削峰填谷是一种在高并发场景下平衡系统压力的技术,通常用于平衡系统在高峰期和低谷期的资源利用率,提高系统的吞吐量和响应速度。在削峰填谷的过程中,通常使用消息队列作为缓冲区,将请求放入消息队列中,然后在系统负载低的时候进行处理。这种方式可以将系统的峰值压力分散到较长的时间段内,减少瞬时压力对系统的影响,从而提高系统的稳定性和可靠性。

另外消息队列还有一下优点:

  1. 可靠性高:消息队列通常具有高可靠性,可以实现消息的持久化存储、消息的备份和故障恢复等功能,保证消息不会丢失。
  2. 扩展性好:通过增加消息队列实例或者添加消费组实例,可以实现消息队列的水平扩展,提高系统的处理能力。
  3. 灵活性高:消息队列通常支持多种消息传递模式,如点对点模式和发布/订阅模式,可以根据不同的业务场景选择不同的模式。

Kafka、ActiveMQ、RabbitMQ和RocketMQ都有哪些区别?

Kafka、ActiveMQ、RabbitMQ和RocketMQ都是常见的消息中间件,它们都提供了高性能、高可用、可扩展的消息传递机制,但它们之间也有以下一些区别:

  1. 消息传递模型:Kafka主要支持发布-订阅模型,ActiveMQ、RabbitMQ和RocketMQ则同时支持点对点和发布-订阅两种模型。

  2. 性能和吞吐量:Kafka在数据处理和数据分发方面表现出色,可以处理每秒数百万条消息,而ActiveMQ、RabbitMQ和RocketMQ的吞吐量相对较低。

  3. 消息分区和负载均衡:Kafka将消息划分为多个分区,并分布在多个服务器上,实现负载均衡和高可用性。ActiveMQ和RabbitMQ和RocketMQ也支持消息分区和负载均衡,但实现方式不同,例如RabbitMQ使用了一种叫做Sharding的机制。

  4. 开发和部署复杂度:Kafka相对比较简单,易于使用和部署,但在实现一些高级功能时需要进行一些复杂的配置。ActiveMQ、RabbitMQ和RocketMQ则提供了更多的功能和选项,也更加灵活,但相应地会增加开发和部署的复杂度。

  5. 社区和生态:Kafka、ActiveMQ、RabbitMQ和RocketMQ都拥有庞大的社区和完善的生态系统,但Kafka和RocketMQ目前的发展势头比较迅猛,社区活跃度也相对较高。

  6. 功能支持:

    | | 优先级队列 | 延迟队列 | 死信队列 | 重试队列 | 消费模式 | 事务消息 |
    | ———— | ————— | ———————————————————————————- | ———— | ————————————————————————————— | ———————————————— | ————————————— |
    | Kafka | 不支持 | 不支持,可以间接实现延迟队列 | 无 | 不直接支持,可以通过消费者逻辑来实现重试逻辑。 | 主要是拉模式 | 支持事务,但限于消息生产。 |
    | RocketMQ | 支持 | 直接支持延迟队列,可以设定消息的延迟时间。 | 支持 | 支持重试队列,可以自动或手动将消息重新发送。 | 支持推和拉两种模式 | 支持事务消息。 |
    | RabbitMQ | 支持 | 支持延迟队列,可以通过插件或者消息TTL和死信交换来实现。 | 支持 | 可以实现重试机制,但需要通过消息属性和额外配置来手动设置。 | 主要是推模式,但也可以实现拉模式 | 支持基本的消息事务。 |
    | ActiveMQ | 支持 | 支持 | 支持 | 支持重试机制,可以配置消息重发策略。 | 支持推和拉两种模式 | 支持消息事务。 |

如何选型?

在选择消息队列技术时,需要根据实际业务需求和系统特点来选择,以下是一些参考因素:

  1. 性能和吞吐量:如果需要处理海量数据,需要高性能和高吞吐量,那么Kafka是一个不错的选择。
  2. 可靠性:如果需要保证消息传递的可靠性,包括数据不丢失和消息不重复投递,那么RocketMQ和RabbitMQ都提供了较好的可靠性保证。
  3. 消息传递模型:如果需要支持发布-订阅和点对点模型,那么RocketMQ和RabbitMQ是一个不错的选择。如果只需要发布-订阅模型,Kafka则是一个更好的选择。
  4. 消息持久化:如果需要更快地持久化消息,并且支持高效的消息查询,那么Kafka是一个不错的选择。如果需要更加传统的消息持久化方式,那么RocketMQ和RabbitMQ可以满足需求。
  5. 开发和部署复杂度:Kafka比较简单,易于使用和部署,但在实现一些高级功能时需要进行一些复杂的配置。RocketMQ和RabbitMQ提供了更多的功能和选项,也更加灵活,但相应地会增加开发和部署的复杂度。
  6. 社区和生态:Kafka、RocketMQ和RabbitMQ都拥有庞大的社区和完善的生态系统,但Kafka和RocketMQ目前的发展势头比较迅猛,社区活跃度也相对较高。
  7. 实现语言方面,kafka是基于scala和java开发的,rocketmq、activemq等都是基于java语言的,rabbitmq是基于erlang的。

why using mq?
https://www.polarishaw.top/2024/07/15/MQ/
作者
Polaris
发布于
2024年7月15日
许可协议