InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

360 开源又一力作——KafkaBridge:让操作 kafka 更简单!

  • 2018-10-15
  • 本文字数:1745 字

    阅读完需:约 6 分钟

导引

KafkaBridge 封装了对 Kafka 集群的读写操作,接口极少,简单易用,稳定可靠,支持 c++/c、php、python、golang 等多种语言,并特别针对 php-fpm 场景中作了长连接复用的优化,已在 360 公司内部广泛使用。

前言

  • 众所周知,Kafka 是近几年来大数据领域最流行的分布式流处理平台。它最初由 LinkedIn 公司开发, 已于 2010 年贡献给了 Apache 基金会并成为顶级开源项目, 本质上是一种低延时的、可扩展的、设计内在就是分布式的,分区的和可复制的消息系统 ;
  • Kafka 在 360 公司内部也有相当广泛的使用,业务覆盖搜索,商业广告,IOT, 视频,安全, 游戏等几乎所有核心业务,每天的写入流量近 1.2PB, 读取流量近 2.4PB;
  • Kafka 官方提供了 Java 版本的客户端 SDK, 但因 360 公司内部产品线众多,语言几乎囊括目前所有主流语言,所以我们研发了 Kafka 客户端 SDK —— KafkaBridge;

简介

  • KafkaBridge 底层基于 librdkafka , 与之相比封装了大量的使用细节,简单易用,使用者无需了解过多的 Kafka 系统细节,只需调用极少量的接口,就可完成消息的生产和消费 ;
  • 针对使用者比较关心的消息生产的可靠性,作了近一步的提升;
  • 开源地址:[ https://github.com/Qihoo360/kafkabridge ]

特点

  • 支持多种语言:c++/c、php、python、golang, 且各语言接口完全统一 ;
  • 接口少,简单易用 ;
  • 针对高级用户,支持通过配置文件调整所有的 librdkafka 的配置 ;
  • 在非按 key 写入数据的情况下,尽最大努力将消息成功写入 ;
  • 支持同步和异步两种数据写入方式 ;
  • 在消费时,除默认自动提交 offset 外,允许用户通过配置手动提交 offset;
  • 在 php-fpm 场景中,复用长连接生产消息,避免频繁创建断开连接的开销 ;

编译

使用

1、数据写入

  • 在非按 key 写入的情况下,sdk 尽最大努力提交每一条消息,只要 Kafka 集群存有一台 broker 正常,就会重试发送 ;
  • 每次写入数据只需要调用 _produce_ 接口,在异步发送的场景下,通过返回值可以判断发送队列是否填满,发送队列可通过配置文件调整 ;
  • 在同步发送的场景中,_produce_ 接口返回当前消息是否写入成功,但是写入性能会有所下降,CPU 使用率会有所上升, 推荐还是使用异步写入方式 ;
  • 我们来简单看一下写入 kafka 所涉及到的所有接口:
复制代码
// 初始化接口
bool QbusProducer::init(const string& broker_list, const string& log_path, const string& config_path, const string& topic)
// 写入数据接口
bool QbusProducer::produce(const char* data, size_t data_len, const std::string& key)
// 不再需要写入数据时,需要调用的清理接口,必须调用
void QbusProducer::uninit()
  • 具体使用可以参考源码中的实例 ;

2、数据消费

  • 消费只需调用 subscribeOne 订阅 topic(也支持同时订阅多个 topic),然后执行 start 就开始消费,当前进程非阻塞,每条消息通过 callback 接口回调给使用者 ;
  • sdk 还支持用户手动提交 offset 方式,用户可以通过 callback 中返回的消息体,在代码其他逻辑中进行提交。
  • 下面是消费接口,以 c++ 为例:
复制代码
// 初始化接口
bool QbusConsumer::init(const string& string broker_list, const string& string log_path, const string& string config_path, QbusConsumerCallback& callback)
// 订阅需要消费的消息
bool QbusConsumer::subscribeOne(const string& string group, const string& string topic)
// 开始消费
bool QbusConsumer::start()
// 停止消费
void QbusConsumer::stop()

性能测试

  • kafka 集群三台 broker, 除测试用 topic 外,无其他 topic 的读写操作 ;
  • 测试用 topic 有 3 个 partition;
  • Producer 单实例,单线程 ;
  • Topic 无复本下测试:
    1. 单条消息 100 byte, 发送 1 百万 条消息,耗时 1.7 秒 ;
    2. 单条消息 1024 byte, 发送 1 百万 条消息,耗时 13 秒 ;
  • Topic 有 2 复本下测试:
    1. 单条消息 100 byte, 发送 1 百万 条消息,耗时 1.7 秒 ;
    2. 单条消息 1024 byte, 发送 1 百万 条消息,耗时 14 秒 ;

写在最后

  • KafkaBridge 一直在 360 公司内部使用,现在已经开源,有疏漏之处,欢迎广大使用者批评指正,也欢迎更多的使用者加入到 KafkaBridge 的持续改进中。
  • 开源地址: KafkaBridge

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2018-10-15 04:202333
用户头像
张婵 InfoQ 技术编辑

发布了 87 篇内容, 共 50.3 次阅读, 收获喜欢 218 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

GitHub Pulse 是什么?它是否能衡量 OpenTiny 开源项目的健康程度?

Kagol

开源 Vue 前端 UI组件库

从java到JavaScript(2):对比Java/Go/Swift/Rust看Dart

zhoulujun

Java JavaScript dart

gis经纬度坐标转换多格式兼容:支持字符串/数组/GeoJSON

zhoulujun

GIS GeoJSON 经纬度坐标转换

开源7天Github斩获4.5万Stars!阿里2023版高并发设计实录鲨疯了

Java你猿哥

Java 面试 高并发 面经 春招

从0到1构建基于自身业务的前端工具库

京东科技开发者

前端 京东云 企业号 4 月 PK 榜

React Native UI界面还原,组件布局与动画效果

zhoulujun

从java到JavaScript(1),看Dart:对比Java/Go/Swift/Rust

zhoulujun

Java JavaScript swift rust dart

百度高德地图行政区域边界GeoJSON数据获取并绘制行政区域

zhoulujun

百度地图 高德地图

Hex Tech,一个带编程协同能力的 BI 平台的“危”与“机”

CnosDB

数据库 时序数据库 开源社区 CnosDB

聚焦弹性问题,杭州铭师堂的 Serverless 之路

阿里巴巴云原生

阿里云 云原生

ZBC 荣登OKX涨幅榜前列,月内涨幅逾六成

鳄鱼视界

玩转Github:三分钟教你如何用 Github 快速找到优秀的开源项目

Java你猿哥

Java GitHub 开源 源码 ssm

selenium源码通读·2 | common/exceptions.py异常类

虫无涯

Python 源码 测试 自动化测试 selenium

GIS拓扑讲解点线面几何体的拓扑关系判断及运算分析_turf案例

zhoulujun

GIS Turf.js

GIS常用npm包:GeoJSON文件合并与元素过滤\属性过滤\图形合并

zhoulujun

GIS GeoJSON

数据库原理及MySQL应用 | 数据库安全加固

TiAmo

MySQL 数据库 数据安全

三天吃透Redis八股文

程序员大彬

redis #java

微前端项目部署方案

京东科技开发者

微前端 京东云 企业号 4 月 PK 榜

协同编辑:Google Wave架构分析

zhoulujun

Google Wave 协同编辑 Google Wave Federation

百度高德地图JS-API学习手记:地图基本设置与省市区数据加载

zhoulujun

百度地图 高德地图

信息率失真函数与平均互信息

timerring

信息论

性能测量工具-DevTools/PageSpeed/LightHouse

zhoulujun

DevTools PageSpeed LightHouse 性能测量工具

Taro架构构析(2):Taro 设计思想及架构

zhoulujun

架构实战营 - 备选架构设计文档模板

华仔

Taro架构构析(1):多端框架分析,Taro WePY uni-app对比

zhoulujun

wepy taro uni-app

ZBC 荣登OKX涨幅榜前列,生态持续发力是关键

西柚子

Go 命令行参数解析工具 pflag 使用

江湖十年

后端 命令行 Go 语言

Three.js 进阶之旅:全景漫游-高阶版在线看房 🏡

dragonir

JavaScript 前端 three.js

JWT 实现登录认证 + Token 自动续期方案,这才是正确的使用姿势!

Java你猿哥

Java ssm 架构师 Token JWT

Weex原理及架构剖析

zhoulujun

Weex ReactNative weex-vue-framework

文本处理流程:Text Workflow 1.5.1直装版

真大的脸盆

文本处理 处理文本 文本管理工具

  • 扫码添加小助手
    领取最新资料包
360开源又一力作——KafkaBridge:让操作kafka更简单!_DevOps & 平台工程_张婵_InfoQ精选文章