关于这个博客 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

个人项目#

我有几个个人项目:

  • 快速时区包
  • 支持 Caiyun API 的wego的 forked 版本,演示
  • 用于计算 AQI(空气质量指数)的 Go 包aqi

教育背景#

我在 2015 年至 2019 年间在北方工业大学获得了信息和计算科学的学士学位。

更多信息#