# 常用的 MQ 框架以及选型

# 常见的消息队列对比

ActiveMQRabbitMQRocketMQKafka
性能6000 / 单机12000 / 单机10W / 单机100W / 单机
持久化支持(性能会下降)支持(性能会下降)天生支持天生支持
多语言支持主流都主流都Java主流都
综合缺乏大规模的运用不推荐高可用(Erlang)有管理界面 内部机制难了解,集群不支持动态扩展模型简单、接口易用 阿里大规模运用性能比较好 缺点:只支持 Java天生分布式、性能最好 缺点:运维难度大

# 选型说明

  1. 中小型软件公司,建议选 RabbitMQ。一方面,erlang 语言天生具备高并发的特性,而且他的管理界面用起来十分方便。不考虑 rocketmq 和 kafka 的原因是,一方面中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以 kafka 排除。RocketMQ 也很不错,只是没有 RabbitMQ 出来的早,文档和网上的资料没有 RabbitMQ 多,但也是很不错,RocketMQ 是阿里出品,现在阿里已经把 RocketMQ 捐赠给 Apache 了,维护和更新不是问题 。
  2. 大型软件公司,根据具体使用在 rocketMq 和 kafka 之间二选一。一方面,大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对 rocketMQ, 大型软件公司也可以抽出人手对 rocketMQ 进行定制化开发,毕竟国内有能力改 JAVA 源码的人,还是相当多的。至于 kafka,根据业务场景选择,如果有日志采集功能,肯定是首选 kafka 了。具体该选哪个,看使用场景

# RabbitMQ

RabbitMQ 是一个开源的消息代理软件,它实现了 AMQP(高级消息队列协议)标准。以下是 RabbitMQ 的一些特点:

  1. 可靠性:RabbitMQ 提供了多种机制来保证消息的可靠性,包括消息的持久化、确认机制、事务机制等。
  2. 灵活性:RabbitMQ 支持多种消息传输模式,包括点对点模式、发布 / 订阅模式、RPC(远程过程调用)模式等,可以根据不同的需求选择合适的模式。
  3. 扩展性:RabbitMQ 可以通过添加新的节点来扩展系统的处理能力,支持水平扩展和垂直扩展。
  4. 可管理性:RabbitMQ 提供了丰富的管理工具,可以方便地管理消息队列、交换机、绑定等。
  5. 消息持久化:RabbitMQ 支持将消息持久化到磁盘,即使服务器出现故障,消息也不会丢失。
  6. 高可用性:RabbitMQ 支持主从复制和镜像队列等机制,可以保证系统在节点故障时仍然能够正常工作。
  7. 多语言支持:RabbitMQ 支持多种编程语言,包括 Java、Python、Ruby、.NET 等,可以方便地与不同的应用程序集成。

总之,RabbitMQ 是一个可靠、灵活、可扩展、易管理、高可用、跨语言的消息队列系统,适合在分布式系统中处理大量数据和复杂业务逻辑。

# Kafka

Kafka 是一个分布式的流处理平台,通常用于处理大规模的实时数据流。以下是 Kafka 的一些特点:

  1. 高吞吐量:Kafka 可以处理大量的消息,每秒可处理数百万的消息。
  2. 可扩展性:Kafka 可以通过添加新的节点来扩展系统的处理能力,支持水平扩展和垂直扩展。
  3. 高可用性:Kafka 采用分布式架构,数据被分布在多个节点上,即使某个节点出现故障,系统仍然能够正常工作。
  4. 消息持久化:Kafka 支持将消息持久化到磁盘,即使服务器出现故障,消息也不会丢失。
  5. 多副本机制:Kafka 支持多副本机制,即将数据备份到多个节点上,确保数据的可靠性和容错性。
  6. 支持流处理:Kafka 支持流处理,可以用于实时数据处理和分析。
  7. 多语言支持:Kafka 支持多种编程语言,包括 Java、Python、Scala 等。

总之,Kafka 是一个高性能、可扩展、高可用、支持流处理的分布式消息系统,适合在大规模分布式系统中处理实时数据流和事件流。与 RabbitMQ 不同,Kafka 更加适合处理大量的数据和流式数据。