特点
优点
- 解耦。
- 解耦C/S,无需服务发现。
- 支持1-1,1-n通信方式。
- 异步。
- 减少rt。
- 即使消费方暂时不可用也不影响生产方的业务逻辑。
- 削峰。类似缓存,抗峰值流量。
缺点
- 潜在的单点。MQ挂掉影响这个系统,MQ需要可扩展。
- 复杂度提高。消息重复、丢失、顺序等问题。
- 一致性。部分消费成功,部分不成功情况。
典型
rabbitMQ
- 使用AMQP模型。punlisher发布消息到exchange,根据routes发送到绑定的queue,push或者pull给consumer。
- 其他概念:
- broker:消息队列服务器。
- vhost:broker里面设置,用于用户分离。
- channal:每个客户端连接可建立多个channal,代表会话。
- 交换机有四种类型。
- 直连交换机:单播,根据routing key投递给队列。
- 扇形交换机:广播,发送到绑定的所有队列,无视routing key。
- 主题交换机:多播,根据routing key和队列绑定规则发送。
- 头交换机。
- 官方文档,入门教程。
kafka
- 每个topic分为多个partition,并行消费。通过offset来标识已经消费的消息。
- partion可多副本,在不同broker打散容错。
- 一个consumer group(逻辑消费者)由多个consumer组成,消费一个topic。
- 官方文档
对比
- rabbitMQ:erlang语言开发,依靠活跃的开源社区支持。
- 一个队列(topic)一个分片,连接从队列的机器需要路由到主队列上读写。
- 多个consumer需要多个相同的队列。
- 数据一致性、稳定性和可靠性高。
- rocketMQ:阿里出品。
- kafka:业界标准。
- 一个topic多个分片,多个consumerGroup通过offset共享同一个分片。
- 多分片机制->高性能,可扩展,可容错。适合大数据领域等,可改造可靠性。
- RabbitMQ和Kafka到底怎么选。
- 从 Kafka 与 RabbitMQ 的对比看全局
消费注意点
- 处理消息顺序。
- 按key路由到指定分片,串行消费。
- 处理消息重复。
- 业务逻辑幂等。
- 寻找幂等key,记流水去重。