固定链接 滴滴开源分布式消息中间件产品 DDMQ

滴滴开源分布式消息中间件产品 DDMQ

滴滴开源分布式消息中间件产品 DDMQ

滴滴出行消息服务团队近日开源了内部广泛使用的分布式消息中间件产品 DDMQ,这是一款致力于提供低延迟、高并发、高可用、高可靠消息服务的企业级消息队列产品。

产品特性

DDMQ 具有如下的优秀特性:

  • 低延迟高吞吐:毫秒级延迟,单机百万条消息吞吐。
  • 丰富的消息类型:具备实时消息、延时消息和分布式事务消息。
  • 海量消息存储,支持消息回溯消费:支持 RocketMQ 和 Kafka 作为实时消息的存储引擎,使用 RocksDB 作为延时消息的存储引擎。
  • 秒级延时消息:支持单条消息设置精确到秒级的延迟时间,提供普通延时消息和循环延时消息。
  • 多语言客户端:提供了主流开发语言 SDK,包括 PHP, Java, Go, C/C++, Python,在 API 上保持着最易使用的 High Level 形式。
  • 多种消费方式:支持通过 Thrift RPC 拉取、HTTP 推送和第三方存储直写的方式消费消息。
  • 支持灵活的消息过滤和转换功能:通过使用 Groovy 脚本在服务端进行消息体的转换和过滤,能做有效减少客户端和服务器的数据传输量,减轻客户端处理消息的负载。
  • 统一的 Web 控制台:方便用户管理 Topic 等资源,通过控制台可以实现配置生产和消费的限流值、消费方式、Groovy 脚本、启停消费、重置消费进度等功能。
  • 完善的监控配套:提供模块的健康检查和消息堆积告警功能。

适用场景

消息队列作为构建现代分布式应用所必备的基础设施,有着广泛的应用场景:

  • 削峰填谷
    在秒杀等场景下会导致短时间流量的暴涨,下游系统会因为缺少保护而过载甚至崩溃。DDMQ 提供的海量堆积能力和消费限流能够确保下游系统的平稳运行。
  • 异步解耦
    通过上下游系统的松耦合设计,可以保证上游系统不会因为下游系统的宕机而不可用。确保主流程的正常稳定运行。
  • 顺序消息
    现实中需要保证顺序的场景很多,比如订单系统中订单创建、支付、退款等流程,均需要保证顺序。 DDMQ 提供的顺序消费功能可以保证消息的先进先出。
  • 事务消息
    在微服务的场景下,通过 DDMQ 的事务消息能够达到分布式事务的最终一致性。

架构设计

下面这张图描述了 DDMQ 的总体架构。主要包括 Broker Cluster、Producer Proxy Cluster(以下简称 PProxy),Consumer Proxy Cluster(以下简称 CProxy),SDK,Console 等模块:

  • Broker Cluster 是 DDMQ 的消息存储层。使用 RocketMQ 作为实时消息的存储引擎(同时也支持使用 Kafka),Chronos 则是我们基于 RocksDB 自研的延时消息存储引擎。
  • PProxy 是 DDMQ 的生产代理服务, 内置 Thrift RPC Server,生产 SDK 通过 RPC 调用将消息发送给 PProxy,然后再由 PProxy 负责将消息生产到具体的 Broker 中去,在 PProxy 中我们实现了生产限流、重试和消息批量生产等功能。
  • CProxy 是 DDMQ 的消费代理服务,也内置了 Thrift RPC Server,当选择 SDK 消费时,消费方以 pull 的方式从 CProxy 中拉取消息,由于 CProxy 中的 PullBuffer 提前缓存了一定数量的待消费消息,因此消费的延迟很低。如果选择 HTTP 方式消费,则直接由 CProxy 将消息推送到业务指定的回调 URL 地址。在 CProxy 中,我们实现了消息过滤(通过编写 Groovy 脚本)、消息体转换(Transit)、重试、消费限流、顺序消费内部排序等功能。
  • Console是 DDMQ 的控制台,用户通过控制台申请 Topic、Group 等资源。Topic 等数据会持久化到 MySQL 并推送到 Zookeeper;PProxy 和 CProxy 通过读取、监听 Zookeeper 上的 Topic 和 Group 数据来实时控制消息的生产和消费逻辑。

DDMQ 选择 Proxy+SDK 的架构,主要有这几个好处:

  1. 方便实现多语言 SDK,由于滴滴内部使用的技术栈比较多,将主要逻辑放在 Proxy 上有利于降低 SDK 的复杂度,让 SDK 的开发速度大大加快。目前在滴滴内部支持 PHP, Go , C/C++, Java, Python, Node.js 等语言的 SDK 实现。
  2. 存储层业务无感知,由于 Proxy 层屏蔽了后面的 RocketMQ 或 Kafka,使得存储层的切换可以做到业务无感知。
  3. 加快新功能迭代速度,新功能的开发都在 Proxy 层实现,降低了 SDK 的升级频率。

总结

DDMQ 已经在滴滴内部稳定运行了两年多时间,支撑了网约车、小桔车服、地图、金融、智能驾驶、智慧交通、外卖等业务的稳定运行。日消息流水达到千亿级别,整体服务可用性超过 5 个 9。

GitHub 仓库地址:https://github.com/didi/DDMQ

欢迎大家多提 issue !


本文作者:消息服务团队
原文链接:https://mp.weixin.qq.com/s/a3mWo9P9rxQxOuP-fkWZkQ

您的留言将激励我们越做越好