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

中证数据需要处理每秒数千笔的股票交易数据(如Tick级行情),请设计一个实时数据采集与处理架构,并说明如何保证数据的准确性和一致性?

中证数据[数据技术岗]难度:中等

答案

1) 【一句话结论】

采用“数据源校验层 + 高吞吐消息队列(Kafka) + Exactly-Once流处理引擎(Flink) + 事务化存储(Cassandra)”架构,通过交易所数据时间戳/校验和校验、Flink微批处理(1秒窗口)、Kafka 100分区+3副本、Cassandra按股票代码分区,结合Kafka事务与数据库事务,实现秒级延迟、高吞吐,并保证数据准确性与一致性。

2) 【原理/概念讲解】

老师口吻,解释核心组件及关键机制:

  • 数据源校验层:交易所API发送的Tick数据先经过预处理,验证时间戳(是否在当前1秒窗口内)和校验和(如MD5匹配),过滤无效数据,确保输入准确性。
  • 消息队列(Kafka):作为缓冲层解耦数据源与计算,配置100个分区(根据数据量,分区数=并发数/每分区吞吐)、3副本,持久化存储避免数据丢失。
  • 分布式流处理引擎(Flink):核心处理单元,设置微批处理时间1秒(TumblingProcessingTimeWindow.of(Time.seconds(1))),并行度=CPU核心数*2(如16核对应32并行度),通过检查点机制(CheckpointInterval=5000ms)保证状态一致性,实现Exactly-Once语义。
  • 事务化存储(Cassandra):按股票代码(symbol)分区存储原始Tick数据,支持高并发写入(每秒数千笔),通过ACID事务(如CQL事务)保证数据一致性,同时Redis缓存热点聚合结果(如实时均价)提升查询效率。

3) 【对比与适用场景】

组件定义特性使用场景注意点
数据源校验层交易所数据预处理模块时间戳验证、校验和检查过滤无效Tick数据需与交易所API对接,实时校验
Kafka分布式消息队列高吞吐(分区并行)、持久化、副本机制数据缓冲、解耦系统分区数=并发数/每分区吞吐,副本因子≥2
Flink分布式流处理引擎Exactly-Once、微批处理、状态管理实时计算、复杂事件处理微批处理时间=1秒,并行度=CPU核心数*2
Cassandra分布式数据库高并发写入、水平扩展、分区键优化持久化存储原始数据+聚合结果分区键=股票代码,避免热点分区

4) 【示例】

伪代码展示最小可运行架构(含数据源校验、Kafka生产、Flink处理、Cassandra写入):

  • 数据源校验(Python伪代码):
    import json, hashlib, time
    def validate_tick(data):
        # 时间戳验证:当前时间±1秒内
        if not (time.time() - 1 <= data['timestamp'] <= time.time() + 1):
            return None
        # 校验和验证:计算MD5并对比
        expected_checksum = "expected_md5"
        if hashlib.md5(json.dumps(data).encode()).hexdigest() != expected_checksum:
            return None
        return data
    
  • Kafka生产(Python伪代码):
    from kafka import KafkaProducer
    producer = KafkaProducer(bootstrap_servers='kafka:9092', 
                             value_serializer=lambda v: json.dumps(v).encode('utf-8'))
    for tick in validated_ticks:
        producer.send('stock-tick', tick)
    
  • Flink处理(Python伪代码):
    from pyflink import StreamExecutionEnvironment
    env = StreamExecutionEnvironment.get_execution_environment()
    env.set_parallelism(32)  # 并行度=CPU核心数*2
    data_stream = env.add_source(KafkaSource(...))
    processed = data_stream
        .filter(lambda x: x['volume'] > 0)  # 过滤无效数据
        .key_by(lambda x: x['symbol'])      # 按股票代码分组
        .window(TumblingProcessingTimeWindow.of(Time.seconds(1)))  # 1秒微批处理
        .aggregate(lambda acc, cur: (acc[0] + cur['volume'], acc[1] + cur['price']), 
                  lambda acc, cur: (acc[0] + cur['volume'], acc[1] + cur['price']))  # 聚合
        .map(lambda x: {'symbol': x[0], 'avg_price': x[1]/x[0], 'total_volume': x[0]})
    processed.write_output(RedisSink(...), CassandraSink(...))  # 写入缓存+数据库
    
  • Cassandra写入(CQL示例):
    BEGIN TRANSACTION;
    INSERT INTO stock_tick (symbol, price, volume, timestamp) VALUES ('000001', 10.5, 1000, 1699112800);
    INSERT INTO stock_agg (symbol, avg_price, total_volume, window_end) VALUES ('000001', 10.5, 1000, 1699112800);
    COMMIT;
    

5) 【面试口播版答案】

(约90秒,自然表达)
“面试官您好,针对每秒数千笔股票Tick数据的实时处理需求,我设计的架构核心是构建一个‘数据源校验 + 高吞吐消息队列 + Exactly-Once流处理引擎 + 事务化存储’的闭环系统。首先,数据源(交易所API)发送的Tick数据会先经过校验层,验证时间戳(是否在当前1秒窗口内)和校验和(MD5匹配),过滤无效数据,确保输入准确性。然后,数据进入Kafka,配置100个分区(每秒数千笔,分区数=并发数/每分区吞吐)和3副本,作为缓冲层解耦数据源与计算,避免数据丢失。接着,Flink消费Kafka数据流,设置微批处理时间为1秒(TumblingProcessingTimeWindow.of(Time.seconds(1))),并行度为CPU核心数*2(假设16核,并行度32),通过检查点机制(CheckpointInterval=5000ms)保证状态一致性,实现Exactly-Once语义。处理后的数据一方面写入Redis缓存热点聚合结果(如实时均价),另一方面通过Cassandra的ACID事务持久化,按股票代码分区(分区键=symbol),保证数据一致性。这样,整个架构既能通过微批处理将延迟控制在1秒以内,满足秒级延迟要求,又能通过Kafka事务(生产Kafka消息→写入数据库的原子操作)和数据库事务,确保数据准确性与一致性。”

6) 【追问清单】

  • 问题1:如何保证数据延迟在秒级以内?
    回答要点:采用Flink的微批处理(1秒窗口),结合Kafka的批量发送(减少网络开销),降低系统延迟。
  • 问题2:系统如何处理数据丢失或重复?
    回答要点:Kafka的持久化+副本机制保证不丢失;Flink的Exactly-Once语义结合幂等消费(消息处理后标记为已处理,重复消息跳过)。
  • 问题3:如何扩展系统以应对数据量增长?
    回答要点:Kafka增加分区和副本,Flink增加并行度,数据库水平扩展(如Cassandra的分区键调整)。

7) 【常见坑/雷区】

  • 坑1:忽略数据源校验,仅说架构不提时间戳、校验和验证。反问:若交易所数据时间戳错误或校验和异常,如何处理?
  • 坑2:低延迟机制不具体,仅说“低延迟”口号。反问:如何将延迟控制在1秒以内?
  • 坑3:工程参数缺失,如Kafka分区数、Flink并行度、Cassandra分区键设计。反问:如何配置Kafka分区数、Flink并行度?
  • 坑4:未考虑故障处理,如Kafka宕机、Flink任务失败。反问:若Kafka宕机,数据会丢失吗?若Flink任务失败,如何恢复?
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1