Go在广发证券分布式行情和交易系统的应用和实践

本文介绍了广发证券如何使用Go语言构建高性能、高可用的分布式行情和交易系统。文章讨论了证券行情和交易系统的特性,如高并发、高推送流量、数据计算量大以及安全性要求,并分享了广发证券在服务架构、高并发、高质量推送、高可用性等方面的解决方案和遇到的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者简介:罗意,广发证券 IT 中后台系统架构师。2013 年初加入腾讯,主要负责腾讯微博的转发评论的逻辑层和存储层,后期负责微博后台的基础组件研发。2016 年加入广发证券信息技术部,主要负责行情、交易等中后台业务的系统架构设计和研发工作。在高性能、高可用后台系统架构设计方面经验丰富。目前专注于金融 IT 系统、FinTech 等相关技术的应用,关注互联网技术和金融系统的深度融合。


目录

  1. 证券行情和交易系统服务架构

  2. 如何做到高并发、高性能?

  3. 如何做到高质量推送?

  4. 如何做到高可用、可扩展?

  5. 遇到的挑战点


        广发证券是最早在自研系统中使用Go语言的券商之一,我们大概有接近3年的使用经验。现在广发自研的分布式系统以及一些高性能的系统或者对性能优要求的系统,基本上都是用Go实现的。

      我们团队使用Go语言自研的系统有:

      1、行情云系统,要求高性能。

      2、分布式交易中台系统,要求安全、稳定。

      今天主要和大家交流这两个基于Go改造的系统。


证券行情和交易系统的特点

• 行情用户连接并发峰值高

• 行情数据时效性要求高

• 行情数据推送流量大

• 行情指标计算量大

• 安全、稳定、快速


行情和交易系统有各自的特点:

  1、行情用户连接并发数高。9点到11点半开盘期间,用户在线时间比较长,而且是长链接。

  2、行情数据时效性要求高。用户要求我们的行情数据更新速度要尽量快,来自于交易所(深交所、上交所)的行情数据,大概是3秒一个更新数据快照,要求券商系统尽快将交易所的最新行情数据送达用户终端。我们要采用的是行情数据由后台主动推送的方式。

   3、行情数据推送流量大。广发证券作为第一梯队券商有约1800万用户,牛市时最高同时在线约50-80万。一个用户平均订阅自选股约10个,这样同时对外的行情推送量就很大,约200万左右QPS,实际是100万QPS左右。高峰时刻在9点30开盘和13点开盘的那会儿,流量非常大。     

   4、行情数据指标的计算量大。从交易所快照行情数据到行情指标数据,需要经过大量计算工作。以十种K线计算为例,证券数约2W,每天开市4小时,每3秒刷新一次行情,共需计算7.2亿次。再加上实时,分时,市盈率,涨跌幅,委比,委差等十几项指标计算,每日计算量在10亿级别以上。

   5、主管部门对于券商管控比较严。交易系统的安全、稳定就显得非常重要的。虽然我们用互联网思维解决这些问题,但还是需要有适应性来适应券商的环境,不能做得像互联网那么灵活,比如说用户无感升级,比如说扩容,服务器和网络成本。其实针对灵活性、成本、安全、稳定等指标会有一些平衡性的取舍。一旦有一个用户下单没有成功或者下错单了,下单没成功我们系统需要尽快让用户知道是否成功与否,而不应去做重试了,以避免系统下错单。再者就是交易速度要快,在牛市的时候,很多券商下不了单,也就是处理速度和稳定性存在问题的。我们需要在交易速度快的同时也进行过载保护等措施。


1.证券行情和交易系统服务架构

640?wx_fmt=png

       广发行情云系统从外包转向自研,我们做的事情改变后台设计架构,以适当高并发、高推送流量的稳定可靠的系统要求首先,我们对整个行情和交易业务进行梳理拆分:

       一是横向拆分,借鉴于微服务或分布式相关理念来进行业务拆分。依据功能完整、数据同构、职责单一的原则进行横向拆分为实时行情、K线行情、分时行情、分笔行情、板块行情、资金流向、代码链、鉴权服务、交易服务、期权期货、基金债券和Lv2行情。

       二是纵向拆分依据合理分层,剥离逻辑和存储的原则将行情云系统进行纵向拆分为接入网关、读逻辑层、数据存储层、写逻辑层、行情转码层。将交易系统拆分为接入层、逻辑层、柜台接入层、柜台交易层。

证券行情和交易系统服务架构图640?wx_fmt=png

交易系统架构



### 广发证券高性能行情接入网关系统架构与部署 #### 系统概述 广发证券的高性能行情接入网关系统旨在提供稳定、高效的市场数据传输通道。该系统不仅能够处理大量并发请求,还具备低延迟特性,确保交易者能及时获取最新的市场价格信息。 #### 架构设计 系统的整体架构基于分层设计理念,分为以下几个主要部分: - **入口层**:负责接收来自不同源的数据流并初步过滤无效或重复的信息。这部分通常由高性能服务器集群组成,采用负载均衡机制分配流量。 - **核心处理层**:此层面专注于快速解析接收到的消息包,并将其转换成内部格式供后续模块使用。为了提高效率,这里会利用多线程技术以及专门优化过的算法来加速消息处理过程[^1]。 - **出口层**:经过加工后的实时报价会被推送给订阅了特定股票或其他金融产品的客户端应用程序。这一环节同样依赖于强大的计算资源支持,以保障推送速度服务质量。 #### 关键组件说明 - **服务画像与治理**:通过对用户、系统、角色权限等元数据统一管理,按照系统-服务-运行实例三个层次对应用运行状态进行描述,从而构建起详尽的服务画像体系。这有助于更好地理解各个子系统的运作情况及其相互关系。 - **监控预警平台**:集成了多种监测工具用于跟踪整个网关的工作状况,包括但不限于接口响应时间、吞吐量统计及错误率分析等功能。一旦检测到异常现象,则依据预设策略触发相应的报警通知给运维团队成员。 - **链路拓扑可视化**:借助自动化绘图引擎可以动态生成服务间的连接结构图表,帮助技术人员直观地掌握当前网络布局特点。这对于排查故障点位置非常有用处。 - **中间件配置管理系统**:允许管理员自行定义所需采集的各项性能指标参数,进而满足个性化需求下的精细化运营管理目标。此外还包括日志记录在内的辅助设施也一应俱全。 #### 物理网络适配 考虑到实际应用场景中的复杂性因素影响,在物理网络方面则推荐选用新型硬件形态作为支撑载体。具体而言就是那些专为 VXLAN 技术定制开发出来的边缘装置产品系列——它们能够在不影响原有基础设施的前提下完成必要的协议转换工作,同时保持较高的转发效能水平[^2]。 #### 流式解析能力 针对某些特殊情况下产生的超大规模 XML 文件读取难题,建议引入 Go 语言编写的高效解析库来进行逐片段加载操作。这种方法可以在不占用过多内存空间的情况下顺利完成全部内容提取任务,非常适合应用于此类高密度信息交换场景之中[^3]。 ```go package main import ( "encoding/xml" "fmt" ) type Drug struct { Name string `xml:"name"` } func parseLargeXML(filename string) error { file, err := os.Open(filename) if err != nil { return fmt.Errorf("failed to open file: %v", err) } defer file.Close() decoder := xml.NewDecoder(file) for { token, _ := decoder.Token() if token == nil { break } switch se := token.(type) { case xml.StartElement: if se.Name.Local == "drug" { var d Drug err := decoder.DecodeElement(&d, &se) if err != nil { return fmt.Errorf("error decoding element: %v", err) } fmt.Printf("%s\n", d.Name) } } } return nil } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值