Golang实践之花椒直播总线系统
需求分析
如何做到让公司的所有子系统,微服务中涉及的异步任务能够可衡量,可控制,使用成本低,科学扩容,并且扩容对业务透明。 如何让异步任务更方便调试,从加入,消费,处理,都能够显示的给出,出现的问题报错也能显示的说明。 能够让公司所有业务统一接入,统一管理,而不是分别构建很多子队列系统,分开运维,监控。 对PHP业务要友好,公司的主要线上队列服务使用php,用法是基于php的配置管理+进程管理框架(processWorker)+redis,能快速替换该方案,否则推广是一个问题。(当然现在java,golang也占一部分)
Pepperbus设计
基于以上需求,我们展开对总线队列的设计。
首先存储选型,大趋势来说,肯定是插件化的,无论提供什么样底层存储,应用层提供统一接口。这一点设计上上很容易做到。 第二,入口的通信协议,一定要对调用端友好,因为团队并不想花很多时间,去实现各个语言的总线sdk,所以入口协议我们选择了redis协议,无论长连接还是短连接,连接池,异常处理等细节在各种语言上已经很完备了,只需在逻辑层简单封装即可。既数据生产(add job),采用redis协议。 最后,最重要的就是任务管理,一种模式是开进程,消费总线使用的存储中的数据,过程计时打点,同时总线系统提供必要的进程管理功能(SDK).因为我并不想让业务接入各种数据打点的sdk,想从总线上直接获取第一手的数据采集,针对php的场景,很自然想到了,能否直接与fastcgi进行通信,通信的响应时间,其实就是对于任务的处理时间,同时基于这种方式,可以直接享受到php-fpm可以动态的更新代码的红利。我们异步任务的脚本,也能平滑动态进行更新。当然后期针对fpm的数据转发和通信,包括php-fpm和脚本各种执行时间的配置,我们有过不少的挫折,但后来都迎刃而解。团队之前本身也是负责360的长连接相关技术,对于网络的处理还是有一定的经验的~ 最后就是针对其他语言,直接提供http接口的任务转发。这样一来,方便debug这一条需求也能覆盖住,其实后续所有的异步任务,对于订阅者来说,都是从post请求等获取,理论上本地可以通过curl命令调试异步任务。当然我们提供了一个丰富的dashboard可以完成这个工作,并且测试环境可以获取历史数据,进行重放,减少大家构建请求的时间。不要惊奇,只要sdk控制好超时,用什么协议传数据,都是无所谓的。 业务驱动的Dashboard,队列增删查改,trouble shooting,重放,报警,监控。重新封装一套总线服务的目的,就是要解决业务痛点,最大程度的减少使用复杂度,提供更多有意义的信息。项目成功这一非硬核环节很重要。要好用,要好用,要好用。
系统架构图
架构描述
业务服务器可以与bus总线实例混合部署也可以独立部署,混合部署时可以优先访问本地总线服务器,独立分离部署可以与总线服务用域名进行通信 总线服务器与php-fpm交互可以通过本地也可以通过网络
业务处理流程图说明
业务服务器将任务加入到总线服务 总线服务存储任务到存储 将总线任务传输给cgi进程 cgi进程返回处理结果 总线移除处理任务
业务服务器可以与bus总线实例混合部署也可以独立部署,混合部署时可以优先访问本地总线服务器,独立分离部署可以与总线服务用域名进行通信 总线服务器与php-fpm交互可以通过本地也可以通过网络 总体架构图:
整体架构图
调用部署
项目依赖的其他组件
dashboard: 提供用户管理的web ui。 gokeeper: 提供配置管理服务。
用户使用演示
产品需求走查
最后感谢整个花椒系统开发团队,弟兄们都很给力,用不到一个月时间完成了总线核心的开发。
重磅活动预告
Gopher Meetup 北京站即将开启。来自探探、美团、阿里巴巴、蚂蚁金服的大咖讲师讲带来 Go 开发领域的一线实践经验分享,尽在11月30日,IFC国际财源中心!
Go中国
扫码关注
国内最具规模和生命力的 Go 开发者社区
欢迎投稿,请联系: