360内部消息队列系统Qbus介绍

360内部消息队列系统Qbus介绍
最新回答
ㄨ菲薄的青春

2026-02-21 22:33:05

360内部消息队列系统Qbus介绍

Qbus简介

Qbus是360团队基于Kafka深度定制的一款符合360内部特点的消息队列系统。其起源可以追溯到LinkedIn用于日志处理的分布式消息队列Kafka,为了满足360对用户行为(如登录、浏览、点击、分享、喜欢)以及系统运行日志(如CPU、内存、磁盘、网络、系统及进程状态)进行实时处理的需求,团队决定开发一个更加适合公司内部现状和业务特点的消息队列系统。相较于传统队列,Qbus在性能和功能上都有了显著提升。

Qbus特点

  • 消息持久化:所有消息都保存在磁盘上,确保数据的持久性。
  • 高吞吐量:能够处理大量的消息,满足高并发场景下的需求。
  • 客户端维护消费状态:客户端负责维护自己的消费状态,减轻服务器负担。
  • 分布式架构:生产者、消费者、服务端都可以分布式部署,提高系统的可扩展性和高可用性。
  • 支持订阅:支持订阅模式,一份消息可以有多份接收者。
  • Push/pull方式:提供Push和Pull两种消息获取方式,满足不同场景下的需求。

Qbus应用场景

  • 消息收发:作为普通的消息系统来使用,支持同步和异步消息传递。
  • 日志收集:收集业务日志进行实时分析、存储等。
  • 数据同步:使用订阅模式,同步数据到各个机房,实现数据的分布式存储和处理。
  • 监控服务:监控服务访问情况,防止用户对网站进行无限制的抓取数据。
  • 活动流跟踪:与Storm和Hadoop结合使用,在Storm上消费数据,处理结果存储到QBus,数据可以异步复制一份到Hadoop进行进一步分析。

Qbus与其它队列对比优势

与Gearman、JMS等消息队列系统相比,Qbus具有以下优势:

  • 消息可持久化:确保消息不会丢失。
  • 分布式架构:服务器可以平滑扩展,业务无需感知。
  • 无单点故障:多机房部署保证系统的高可用性。
  • 支持订阅:一份消息可以有多份接收者,支持跨机房结构,便于并行处理。
  • 高吞吐量:能够处理大量消息,满足高并发需求。
  • 支持消息批量处理:提高消息处理效率。
  • 使用简单:提供易用的SDK和API,降低开发成本。

Qbus原理介绍

原理图

(以下图片展示了Qbus的原理图,由于文本格式限制,无法直接展示图片,但可以通过提供的链接查看)

meta信息

Qbus的meta信息包含集群broker的信息(如ip:port)、topic的存储位置、partition的消费位置信息、所有consumer的信息、当值的coordinator以及agent配置和存活状态信息等。

消息路径

一条消息从生产到消费的路径如下:

(以下图片展示了消息从生产到消费的路径,由于文本格式限制,无法直接展示图片,但可以通过提供的链接查看)

broker集群

Qbus的broker集群由多个完全对等的broker组成,可以平滑扩容,提高系统的可扩展性和高可用性。

(以下图片展示了broker集群的架构,由于文本格式限制,无法直接展示图片,但可以通过提供的链接查看)

Broker存储

  • 每个partition对应一个逻辑log,由多个segment组成。
  • 新的消息追加到最后一个segment文件末尾。
  • 消费者可以根据offset回溯到消息存在的位置重新进行消费。

(以下图片展示了Broker的存储结构,由于文本格式限制,无法直接展示图片,但可以通过提供的链接查看)

Broker高性能的关键

  • 利用文件系统缓存,用户空间不缓存消息。
  • 采用zero-copy技术,比read-send方式节省60%-70%时间。
  • 端到端的批量压缩,提高传输效率。
  • 顺序读写磁盘,效率很高。
  • 不关心消息的状态(是否被消费、消费到哪等等),降低处理复杂度。

性能

Qbus支持php、C/C++、java版本的SDK,性能与消息大小的趋势图如下:

(以下图片展示了Qbus的性能趋势图,由于文本格式限制,无法直接展示图片,但可以通过提供的链接查看)

代码编写示例(java)

  • Producer(异步):

(以下图片展示了Producer的代码示例,由于文本格式限制,无法直接展示代码,但可以通过提供的链接查看)

  • Consumer(回调机制):

(以下图片展示了Consumer的代码示例,由于文本格式限制,无法直接展示代码,但可以通过提供的链接查看)

QBus相对于Kafka的改进

  1. 增加可靠传输请求类型,broker会对消息进行确认,提高消息传输的可靠性。
  2. 增加agent节点,用于异步消息收集和日志收集,提高消息收集和处理的效率。
  3. 增加coordinator节点,独立消费分配逻辑,解决惊群效应,降低多语言开发成本。
  4. 根据QBus系统设计改进php sdk,并重写C/C++、java SDK,提高SDK的易用性和性能。
  5. 增加消息自助管理平台,方便用户对消息进行管理,提高系统的可维护性。

综上所述,Qbus是360团队基于Kafka深度定制的一款符合公司内部特点的消息队列系统,具有消息持久化、高吞吐量、分布式架构、支持订阅等特点,并在性能、易用性、可维护性等方面进行了多项改进和优化。