Golang实践之花椒直播总线系统

2023-12-08 20:10

本文主要是介绍Golang实践之花椒直播总线系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总线系统大家并不陌生,各个业务团队都有自己的数据流的处理策略,一般都是基于开源的,能提供队列数据结构的产品,进行包装构建。相比较传统业务,直播场景大型活动中洪峰流量较大,因此业务形态上有约20%左右的处理,都采取了异步化。早期内部也有多套解决方案,队列存储部分有基于redis,nsq,kafka的。异步任务消费过程有cron消费,deamon消费,自研发的processWorker(使用php,基于父子进程方式,进行进程管理的工具)。子团队根据需要和技术栈选择和自行维护。如何针对各个业务线有一个统一的异步处理系统,是花椒系统研发团队需要面临的问题,我们不是要造一个队列服务,而是要基于花椒现有的应用,提供一个统一的队列资源管理,运维,监控系统。并且针对不同技术栈的团队进行定制。提供统一友好的可视化服务。目前服务上线以来,已经迁移和承接了花椒直播大部分的异步任务。由于整套服务由于依赖了一些自研发的根据内部场景定制的服务治理等工具,暂时没有对外开源。考虑在Gopher China之后进行开源。

需求分析

  1. 如何做到让公司的所有子系统,微服务中涉及的异步任务能够可衡量,可控制,使用成本低,科学扩容,并且扩容对业务透明。

  2. 如何让异步任务更方便调试,从加入,消费,处理,都能够显示的给出,出现的问题报错也能显示的说明。

  3. 能够让公司所有业务统一接入,统一管理,而不是分别构建很多子队列系统,分开运维,监控。

  4. 对PHP业务要友好,公司的主要线上队列服务使用php,用法是基于php的配置管理+进程管理框架(processWorker)+redis,能快速替换该方案,否则推广是一个问题。(当然现在java,golang也占一部分)

Pepperbus设计

基于以上需求,我们展开对总线队列的设计。

  1. 首先存储选型,大趋势来说,肯定是插件化的,无论提供什么样底层存储,应用层提供统一接口。这一点设计上上很容易做到。

  2. 第二,入口的通信协议,一定要对调用端友好,因为团队并不想花很多时间,去实现各个语言的总线sdk,所以入口协议我们选择了redis协议,无论长连接还是短连接,连接池,异常处理等细节在各种语言上已经很完备了,只需在逻辑层简单封装即可。既数据生产(add job),采用redis协议。

  3. 最后,最重要的就是任务管理,一种模式是开进程,消费总线使用的存储中的数据,过程计时打点,同时总线系统提供必要的进程管理功能(SDK).因为我并不想让业务接入各种数据打点的sdk,想从总线上直接获取第一手的数据采集,针对php的场景,很自然想到了,能否直接与fastcgi进行通信,通信的响应时间,其实就是对于任务的处理时间,同时基于这种方式,可以直接享受到php-fpm可以动态的更新代码的红利。我们异步任务的脚本,也能平滑动态进行更新。当然后期针对fpm的数据转发和通信,包括php-fpm和脚本各种执行时间的配置,我们有过不少的挫折,但后来都迎刃而解。团队之前本身也是负责360的长连接相关技术,对于网络的处理还是有一定的经验的~

  4. 最后就是针对其他语言,直接提供http接口的任务转发。这样一来,方便debug这一条需求也能覆盖住,其实后续所有的异步任务,对于订阅者来说,都是从post请求等获取,理论上本地可以通过curl命令调试异步任务。当然我们提供了一个丰富的dashboard可以完成这个工作,并且测试环境可以获取历史数据,进行重放,减少大家构建请求的时间。不要惊奇,只要sdk控制好超时,用什么协议传数据,都是无所谓的。

  5. 业务驱动的Dashboard,队列增删查改,trouble shooting,重放,报警,监控。重新封装一套总线服务的目的,就是要解决业务痛点,最大程度的减少使用复杂度,提供更多有意义的信息。项目成功这一非硬核环节很重要。要好用,要好用,要好用。

系统架构图

架构描述

  1. 业务服务器可以与bus总线实例混合部署也可以独立部署,混合部署时可以优先访问本地总线服务器,独立分离部署可以与总线服务用域名进行通信

  2. 总线服务器与php-fpm交互可以通过本地也可以通过网络

业务处理流程图说明

  1. 业务服务器将任务加入到总线服务

  2. 总线服务存储任务到存储

  3. 将总线任务传输给cgi进程

  4. cgi进程返回处理结果

  5. 总线移除处理任务

  • 业务服务器可以与bus总线实例混合部署也可以独立部署,混合部署时可以优先访问本地总线服务器,独立分离部署可以与总线服务用域名进行通信

  • 总线服务器与php-fpm交互可以通过本地也可以通过网络

  • 总体架构图:

pepper_bus_overview

整体架构图

调用部署

pepper_bus_overview_1

项目依赖的其他组件

  • dashboard: 提供用户管理的web ui。

  • gokeeper: 提供配置管理服务。

用户使用演示

产品需求走查

1. 后台整体情况,可以按系统进行区分

2. 队列列表管理

3.队列实时监控,可以进行重放清理等设定,新版已经支持灰度重放等。同时会实时显示请求延时,如图:第一列90%的请求在2146ms内完成。

4.显示错误日志查看,可以定位到具体消息id,如果php报错,也会正常展示。

5.方便的测试dashboard,可以将测试历史数据和本地保存的线上历史数据,直接加入bus,拿到异步处理结果

6. 对集群使用的存储进行监控(目前支持pika和redis),扩容对业务透明

最后感谢整个花椒系统开发团队,弟兄们都很给力,用不到一个月时间完成了总线核心的开发。

github:

@youlu-cn 

@specode 

@qudexin1986

@johntech-o

也许你还会喜欢:

  • GO vs PHP ,谁更适合创业公司的中台搭建?

重磅活动预告

Gopher Meetup 北京站即将开启。来自探探、美团、阿里巴巴、蚂蚁金服的大咖讲师讲带来 Go 开发领域的一线实践经验分享,尽在11月30日,IFC国际财源中心!

Go中国

扫码关注

国内最具规模和生命力的 Go 开发者社区

欢迎投稿,请联系:

situzhihui@163.com

这篇关于Golang实践之花椒直播总线系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471182

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

golang实现nacos获取配置和服务注册-支持集群详解

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户... 目录golang nacos获取配置和服务注册-支持集群初始化客户端可选参数配置new一个客户端 支

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo