网易圈圈应用内置交易所方案

201 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

注:这个是在网易工作期间写的一个项目方案,非最终方案,所以应该不会过多涉及生产实际,仅供探讨分布式架构的实现。

前言

百万并发的业务需求显然是需要分布式系统才能完成的任务,用单个数据库完成会存在单点和扩展性问题

如果用分库分表方案,复杂度也很高,单个节点损坏同样影响整个系统,参考如下文章:

单节点10万+,需要分库分表

分层情况(总体)

  • 任务生成

    • 实时交易:实时交易由应用层生成通过负载均衡,经过交易校验后到排序出块层

    • 批量交易:代扣代收规则已经确定后,由专门的批量模块生成相关预备数据给执行者了,到合适时间,排序出块层单独通道加入了拆分后的部分批量执行指令(批量指令预先拆分过,不是边处理边拆分,减少网络流量

  • 任务排重、打包、发布(采用块链式结构,保证交易顺序性,减少传输验证hash的成本)

  • 任务并发执行

    • 任务分解(实时交易分解成一加一减,批量任务已经预先分解成n个,触发即可)

    • 任务分散执行(按from to地址分解,相关地址分在一个执行包,每个线程只管自己部分的任务执行,并将执行结果反馈给master线程汇总判断,并有CAS判断机制,如果有潜在冲突也能重新执行)

    • 执行结果判断OK后,生成本块的mpt树根,格式(区块号码和树根hash),并将本次kv对的set动作放入写入队列中,最后写入mpt树根; 后续根据区块对应的mpt树根,就可以调用磁盘上leveldb中保存的数据,重构当前mpt树根对应的账户余额

第一版(LevelDb版本,所有执行节点数据全冗余,无法应对爆炸式增长的存储量)

在这里插入图片描述

第二版 (第一版时刚到网易,对公技产品不熟悉,后来做第二版时就采用了网易DDB,分布式存储,我们简单改造mpt树读取的是DDB,但日后用sql做复杂查询会比较麻烦)

在这里插入图片描述


目前存在的问题

  • slaver执行单点问题,只影响一部分,但是这部分就不能执行了,我们这边方案类似于传统数据库的分库分表,对数据库的健壮性还是有要求的,初期为求快,对出问题后自动恢复的考虑少点

  • 能执行的业务比较单一

要做交易所,必须明确如下

  • 初期方案主要是求快,对出错自动恢复,恢复速度等考虑少点,需要后期补充

  • 复杂业务放到应用层,比如电商业务,交易所只管转账

  • 授权(包括大额第三方短信)那块业务层考虑,交易所只读取生成后的批量指令;应用层发起充值提现的校验由应用层自行交易,交易所只按指令行事


任务如何分解

  • 按地址分解

  • 预先按首字节划分成256个分片,后续需要可及时迁移到新机器

  • 每个分节点只存自己相关的leveldb数据

  • 只有验证节点(对账节点)才存有全部数据,才能验证其他节点的动作


相关技术

  • 块链式数据结构

  • hash校验

  • mpt树

  • 分布式一致性算法比如etcd的,或者quorum的

  • leveldb