
处理Tick级高频数据时,需通过“数据源实时连接+消息队列缓冲+内存优先存储+流计算低延迟”的链路设计,结合连接重连、分区扩容、多级备份策略,确保数据实时性并避免丢失。
老师口吻解释各环节设计逻辑:
| 组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Kafka | 分布式消息队列 | 高吞吐、持久化、消费组 | 高频数据传输、日志收集 | 需集群部署,管理复杂,分区数影响吞吐 |
| Redis | 内存数据库 | 低延迟、高并发、持久化 | 实时数据存储、缓存 | 内存有限,需持久化,冷数据备份 |
| Flink | 流计算框架 | 低延迟、状态管理、容错 | 实时计算、窗口计算 | 需集群资源,配置复杂,状态管理重要 |
| WebSocket | 实时通信协议 | 双向通信、低延迟 | 数据源实时推送 | 需心跳检测,避免连接中断 |
import websocket
import json
import time
def on_message(ws, message):
tick_data = json.loads(message)
produce_to_kafka(tick_data)
def on_error(ws, error):
print("WebSocket error:", error)
def on_close(ws):
print("WebSocket closed, attempting to reconnect...")
time.sleep(5) # 等待5秒后重连
ws.run_forever()
ws = websocket.WebSocketApp("wss://exchange.api/ticks",
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.run_forever()
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=['kafka:9092'],
value_serializer=lambda v: json.dumps(v).encode('utf-8'),
acks='all') # 确保消息写入磁盘
tick_data = {"symbol": "AAPL", "price": 150.5, "volume": 1000}
producer.send('tick-topic', tick_data)
producer.flush()
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import StreamTableEnvironment, DataTypes
from pyflink.table.window import Tumble
env = StreamExecutionEnvironment.get_execution_environment()
t_env = StreamTableEnvironment.create(env)
t_env.execute_sql("""
CREATE TABLE tick_stream (
symbol STRING,
price DOUBLE,
volume BIGINT,
ts TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'topic' = 'tick-topic',
'value.format' = 'json',
'value.deserializer' = 'org.apache.flink.json.JsonDeserializationSchema',
'properties.bootstrap.servers' = 'kafka:9092',
'properties.group.id' = 'tick-consumer-group'
)
""")
t_env.execute_sql("""
SELECT symbol, AVG(price) AS avg_price, SUM(volume) AS total_volume
FROM tick_stream
TUMBLE (WINDOW SIZE 1 SECOND ON FLOOR(ts BY INTERVAL '1' SECOND))
GROUP BY symbol, TUMBLE_START(ts)
""")
面试官您好,处理Tick级高频数据保证实时性和避免丢失,核心是通过数据源、传输、存储、处理的链路优化。首先,数据源接入采用交易所的WebSocket实时推送,并实现心跳检测和自动重连,确保连接稳定;传输层用Kafka作为消息队列,配置10-20个分区缓冲流量;存储层用Redis内存缓存高频数据,内存10GB+,每分钟持久化备份;处理层用Flink流计算,毫秒级延迟处理。整个链路通过连接重连、分区扩容、多级备份,确保数据实时性并避免丢失。