RabbitMQ

RabbitMQ 是什么

  • 一个通用的消息代理中间件。
  • 基于消息队列。
  • 被设计为灵活的路由代理以及被动消费者模型。

为什么使用 RabbitMQ

  • RabbitMQ 已经发展了很多年,成熟稳定。
  • 多客户端,插件支持,易于使用。
  • 完善的 web 管理与监控。
  • 消息路由策略非常灵活,可以应对复杂的业务场景。
  • 一致性,高可用,低延迟,高吞吐等可以灵活配置。
  • 通过 feature flags 实现集群滚动升级。
  • 严格的顺序性保证。

Kafka

Kafka 是什么

  • 具有消息语义的分布式提交日志系统。
  • 分布式流处理平台

为什么使用 Kafka

  • 极高的吞吐与扩展。
  • 事件重放功能。
  • 流处理平台标准。
  • topic 可以有 nconsumer group 消费。
  • 单分区顺序性保证。
  • Kafka connector 生态。
  • 消息格式变更向后兼容。

什么时候使用 RabbitMQ 而不是 Kafka

如果不是必须需要 Kafka 的某个特性,那么 RabbitMQ 可以提供灵活的路由,满足高吞吐和实时处理需求,同时运维会比 Kafka 简单很多。

  • 涉及到不同应用的需求可以灵活选择。
  • 需要彻底解耦生产者和消费者。
  • 每个消费者所涉及的绑定到 exchange 队列都互相独立。
  • 消费者不需要处理不相关的消息。

什么时候使用 Kafka 而不是 RabbitMQ

  • 需要流处理的场景。

  • 需要极高的吞吐。

  • 需要聚合多个数据源来汇集数据。

  • 极高的扩展(RabbitMQ 最多 5 个 broker)。

  • 事件重放。

  • 消息格式变更。

RabbitMQ 缺点

  • 在网络分区的情况下运维复杂度比较高。
  • 一个队列一个线程,如果队列过多线程切换代价高,影响消息处理效率。
  • broker 扩展到 3 个以上会降低性能。
  • 没有事件重放功能。
  • 不支持流处理。

Kafka 缺点

  • 运维复杂度高。需要额外的 zookeeper 集群。

  • 需要仔细设计分区数。

  • 存储管理复杂。

  • 不同的团队需要协调生产者和消费者组,无法实现生产者消费者完全解耦。

    image

    图片来源:https://jack-vanlightly.com/sketches。

  • 没有完善的 web管理,监控。

总结

暂时大概的梳理了一下 RabbitMQKafka 的优缺点和使用场景,后面看看再梳理一下它们各自实现的一些细节。