51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个用于交易数据的存储方案,需满足实时性(毫秒级写入)、一致性(交易与清算数据匹配)、数据持久化(至少20年留存),并说明数据库选型与数据模型设计。

上海证券交易所A02难度:困难

答案

1) 【一句话结论】
采用“时序数据库(如TimescaleDB)+关系型数据库(如PostgreSQL)+对象存储(如S3)”的三层存储架构。时序数据库负责毫秒级写入原始交易数据,关系型数据库通过ACID事务保证交易与清算数据一致性,对象存储通过生命周期规则实现至少20年数据持久化。

2) 【原理/概念讲解】
要满足“实时性(毫秒级写入)”,需选择专为时间序列数据设计的数据库(如TimescaleDB、InfluxDB)。这类数据库通过时间切片技术将数据按时间分区(如按小时、天),减少查询时I/O开销,并支持批量写入(如每批1000条数据一次性提交),降低网络开销,确保每笔交易数据在毫秒级内落地。类比:高速流水线,数据快速进入,按时间切片存储,查询时只需访问对应时间块。

“一致性(交易与清算数据匹配)”要求强事务保障,需依赖支持ACID事务的关系型数据库(如PostgreSQL、MySQL)。通过事务机制(如BEGIN...COMMIT)确保交易记录与清算记录同时写入数据库,事务隔离级别设为SERIALIZABLE(最高级别),避免脏读、不可重复读等并发问题,保证两者严格匹配。类比:财务总账的记账规则,每笔交易必须与对应的清算记录同时确认,不能单独存在。

“数据持久化(至少20年留存)”需选择海量、长期存储方案,对象存储(如Amazon S3、Ceph)具备高容量、低成本的归档能力。通过生命周期规则(如设置数据在归档前保留20年,自动迁移至冷存储),确保数据长期不丢失。类比:档案库的长期保存,历史数据不会因系统升级或容量限制而丢失。

3) 【对比与适用场景】

数据库类型定义特性使用场景注意点
时序数据库(如TimescaleDB)专为时间序列数据(带时间戳的指标)设计的数据库高吞吐、毫秒级写入、支持时间切片查询、批量写入交易原始数据(价格、成交量、订单状态等)、实时监控指标适合实时写入,不适合复杂关联查询(如跨表JOIN),需专门优化
关系型数据库(如PostgreSQL)支持ACID事务的关系型数据库强一致性、事务隔离(SERIALIZABLE)、复杂查询能力交易与清算数据关联(如交易ID-清算ID对应)、业务逻辑处理(如清算规则计算)写入延迟较高(毫秒级),不适合实时写入,但能保证数据一致性
对象存储(如S3)基于对象的分布式存储系统海量存储、长期归档、高可用、生命周期管理20年历史数据归档、冷数据存储(如历史行情、清算记录)读取延迟高(秒级),不适合实时查询,需通过归档策略管理

4) 【示例】
伪代码示例(交易数据写入流程):

def write_transaction_data(transaction_id, price, volume, timestamp):
    # 1. 写入时序数据库(毫秒级写入,批量提交)
    tsdb.batch_write([
        {"transaction_id": transaction_id, "price": price, "volume": volume, "timestamp": timestamp}
    ])  # TimescaleDB批量插入,减少网络开销
    
    # 2. 写入关系型数据库(保证一致性,事务隔离级别SERIALIZABLE)
    with db.transaction(isolation='SERIALIZABLE'):  # 开启高隔离事务
        db.insert_transaction(transaction_id, price, volume, timestamp)  # 交易表
        db.insert_clearing(transaction_id, price, volume, timestamp)  # 清算表
        # 事务确保交易与清算记录同时写入,原子性操作
    
    # 3. 定时归档到对象存储(20年持久化,生命周期规则)
    if is_archive_time(timestamp):  # 比如每季度归档历史数据
        s3_client.put_object(
            Bucket='s3-transaction-archive',
            Key=f'transactions/{transaction_id}.json',
            Body=json.dumps({
                "transaction_id": transaction_id,
                "price": price,
                "volume": volume,
                "timestamp": timestamp
            })
        )
        # 对象存储设置生命周期:标准存储保留20年,自动迁移至冷存储

5) 【面试口播版答案】
“面试官您好,针对上海证券交易所A02岗位的交易数据存储需求,我设计的方案是分层存储架构。首先,时序数据库(比如TimescaleDB)负责毫秒级写入原始交易数据,因为它专为时间序列数据设计,通过时间切片技术将数据按时间分区,支持批量写入,确保每笔交易数据在毫秒级内落地;其次,关系型数据库(如PostgreSQL)通过ACID事务保证交易与清算数据的一致性,事务隔离级别设为SERIALIZABLE,确保交易和清算记录同时写入,避免数据不一致;最后,对象存储(如S3)通过生命周期规则实现20年持久化,比如设置数据在归档前保留20年,自动迁移到冷存储。这样三层结合,既满足实时性、一致性,又实现长期存储。”

6) 【追问清单】

  • 问题:如何保证交易与清算数据的一致性?
    回答要点:通过关系型数据库的ACID事务(如SERIALIZABLE隔离级别),同时插入交易和清算记录,确保事务原子性,避免数据不一致。
  • 问题:20年持久化的具体技术实现?
    回答要点:对象存储的生命周期规则,设置数据保留时间(如20年),自动迁移至冷存储,确保数据长期不丢失。
  • 问题:高可用和容灾方案?
    回答要点:时序数据库和关系型数据库采用主从复制或集群部署(如TimescaleDB的集群模式,PostgreSQL的WAL日志复制),对象存储采用多区域复制(如S3的多区域复制),确保数据不丢失。
  • 问题:数据模型设计如何处理?
    回答要点:时序数据库存储原始交易指标(字段:transaction_id, price, volume, timestamp,索引按时间戳),关系型数据库存储交易与清算关联表(主键transaction_id,外键关联清算表),对象存储存储历史归档数据(JSON格式,包含完整交易信息)。
  • 问题:实时查询与历史查询的分离?
    回答要点:时序数据库用于实时查询(如实时行情、监控指标),对象存储用于历史查询(如20年历史数据回溯),避免实时查询性能受历史数据影响。

7) 【常见坑/雷区】

  • 只选时序数据库忽略持久化:时序数据库适合实时写入,但无法满足20年持久化,容易被反问“如何保证长期存储?”。
  • 只考虑实时性忽略一致性:比如只写时序数据库,关系型数据库未参与,导致交易与清算数据不匹配,被质疑“如何保证一致性?”。
  • 数据模型设计不合理:比如时序数据库表结构复杂(如字段过多),导致查询慢;或关系型数据库表设计不合理(如外键关联过多),影响写入性能。
  • 未考虑高可用:比如单点部署时序数据库或关系型数据库,导致系统不可用,被追问“如何保证高可用?”。
  • 对象存储的访问延迟:比如归档数据需要频繁访问,但对象存储读取慢,导致查询延迟,被质疑“如何平衡长期存储与实时访问?”。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1