关于
关于这个博客 CHANGELOG
关于我
工作经历#
自 2019 年 7 月以来,我在彩云科技担任后端工程师。我的主要职责包括:
- 在 2019 年将天气核心 API 从 Python 2.7 升级到 Python 3.7
- 重写推送系统:
- Python Producer 配合 Celery Worker 将推送任务以 Protocol Buffer Message 的形式写入 Redis list 由 Go worker 推送出去
- 我们可以每秒发送约 3000 个通知
- 使用 Go+Gin 重写了内部的高吞吐量 Flask&FastAPI 服务,以提供高性能的地理计算和天气站数据 API
- 这使我们能够减少到 4 台机器(之前是 7 台),每台都有 8 个 CPU 和 16G 内存,同时实现最大 QPS 10K,p99 延迟在 2ms 以下
- 当调用这些内部服务时,核心 API 的响应时间缩短到了 20ms
- 新的系统可以在 0.02ms 内通过多边形搜索计算输入的经纬度归属于哪个行政区域
- 改造多年的旧代码为 K8S 下的现代架构
- 我们在 2023 年第一季度跨区域流量迁移,并且没有任何停机时间
- 为天气图层开发了动画系统,演示。这对于市场推广非常有用
- 创建了一个存档和查询历史天气站数据的系统:我们在许多 Parquet 文件中存储数据,并使用一些 Celery 工作器进行异步读取和处理
我使用的技术:
- Redis: PubSub / Hash / List
- MongoDB: Geo Index / Aggregation
- Kubernetes: Deployment / Statefulset / CronJob
- Python: Flask / Gunicorn / Uwsgi/ NumPy / FastAPI / Celery / Parquet / Polars
- 顺便说一下,由于 Python 的 AsyncIO 调度器在需要多核心加速的高吞吐量 QPS 下表现不佳,我们放弃了将 FastAPI 用于 CPU 密集型服务。
- 但是,有些服务仍然使用 Flask,因为我们需要一些只有 NumPy 才能提供的功能,这不是 Go 可以做到的。
- 地理计算: H3/Slippy Tiles/Timezone/Administrative Boundary check/Point-In-Polygon/Ray casting/…
- Go: Gin/Protocol Buffers/gRPC
- Rust: 制作 Python 扩展,如 tzfpy
个人项目#
我有几个个人项目:
教育背景#
我在 2015 年至 2019 年间在北方工业大学获得了信息和计算科学的学士学位。