Go语言的优势和Go社区的不断壮大,带动了对go client的大量需求,目前Apache Pulsar社区提供了基于cgo封装的pulsar-client-go,但是cgo本身存在如下问题:

1.我们在使用cgo进行封装的时候遇到诸多问题;

2.cgo本身性能上的问题以及难于debug,导致pulsar-client-go对go社区不够友好

以上两点促使我们基于原生的Go语言对pulsar-client-go进行封装。本次我要和大家分享我们在使用cgo进行封装pulsar-client-go时遇到的问题,如何对java client接口进行抽象,如何使用Go语言对pulsar-client-go进行再封装及项目的状态、规划和安排。

注脚

展开查看详情

1.Go in @wolfstudy 2019/3/23

2.pulsar-client-go cgo go Go functions What function Why function 使⽤用场景 function server实现 Go function 实现 example 2

3.⼜又是 build error ? !3

4. CGO 不不是 GO • Go 最初的定位(下⼀一代的c) • 混合编程(c 与 go) • cgo 是⼀一种⼯工具,不不是go语⾔言的扩 展 • 不不⽀支持交叉编译 https://dave.cheney.net/2016/01/18/cgo-is-not-go

5. 性能损耗 • go的内存模型与c的不不⼀一致 • ⼤大量量的runtime.cgocall()(go tool objdump) • 阻塞可能导致 M 的数量量陡增 • 内存管理理⽅方式不不同

6.随缘 debug

7. 使⽤用CGO的感悟 • ⼀一定要严格控制边界 • 谨慎使⽤用指针 • 注意类型转换 • 尽量量减少与c的调⽤用 • 注意内存在哪⾥里里分配

8.cgo 版本迭代 • 1.5 • 1.8 • 如果C struct 以零⻓长度字段结束,但 • cgo 命令⽀支持 -srcddir 参数 ⾃自身⻓长度不不为零,则go不不能改字段 • 1.6 • cgo 代码调⽤用 C.malloc,返 回 NULL 将导致进程奔溃。 • C 代码共享go指针,确保与gc共存。 • 新增 C.complexfloat(complex64)、 • 1.10 C.complexdouble(complex128) • ⽀支持类型别名 • 1.7 • 新函数 C.Cbytes • ⽀支持直接从 C 访问 Go 字符串串 • 1.8 • 1.11 • 环境变量量 PKG_CONFIG ⽤用于设置 • macOS/ios 内核调⽤用,通过 #cgo pkg-config 指令。 libSystem.so !8

9.native go client !9

10.架构调整 10

11.项⽬目状态

12.项⽬目规划 功能列列表: • producer • consumer • schema • … https://github.com/wolfstudy/pulsar-client-go

13.go function

14.计算框架的演进

15. what function 1. 从input topic中消费消息 2. 将⽤用户提供的处理理逻辑应 ⽤用到每条消息上 3. 将结果publish到output topic !15

16. why function • 部署简单 • Localrun(本地运⾏行行⼀一个函数,适⽤用于开发者) • managed-worker service来运⾏行行和管理理functions • k8s:每个function等价于⼀一个k8s的statefulset,利利⽤用k8s进⾏行行 弹性扩展 • 接⼝口简单 • 运维简单 !16

17. 使⽤用场景 • ETL • Data Enrichment • Data Filtering • Routing

18.function server 实现 !18

19. 流程 • ⽤用户给REST server发送⼀一个请求 • REST server响应⽤用户的请求 • Function Metadata Manage将更更新写到FMT • Function Metadata Manager从FMT中读取更更新 • Scheduler Manager 将更更新写到 assignment topic • Function Runtime Manager 从assignment topic中读取更更新 • Membership Manager 配合 Coordination Topic 来做leader的选举 • Membership Manager 配合 Coordination Topic 保证 active membership的资格

20. Go function 实现 • 与java、py instance的区别 • 实现的思路路 • 实现的⽅方案 • SDK • example • plugin !20

21.SDK Demo

22. Community ✓ Twitter: @apache_pulsar ✓ Wechat Subscription: ApachePulsar ✓ Mailing Lists
 dev@pulsar.apache.org, users@pulsar.apache.org ✓ Slack
 https://apache-pulsar.slack.com (#china) ✓ Localization
 https://crowdin.com/project/apache-pulsar ✓ Github
 https://github.com/apache/pulsar
 https://github.com/apache/bookkeeper

23.谢谢参与!