心知天气数据API 产品的高并发实践
心知天气数据API 产品的高并发实践
心知天气作为国内领先的商业气象服务提供商,天气数据API 产品从公司创立以来就一直扮演着很重要的角色。2009 年API 产品初次上线,历经十年,我们不断用心迭代,已经为数百家企业客户提供了超过540亿次稳定可靠的数据服务。在心知天气官网首页一直跳动的调用量数字就实时展示了整个天气API 产品的服务状态。目前,心知天气数据API 的QPS 在高峰时期已经达到数千的量级,如何承载这样海量的并发请求,使客户能稳定及时的获取到所需数据自然也是心知技术团队一路以来不断探索的主题。
心知天气API 服务实时访问量
访问量特点
天气数据的基本属性和客户本身的业务需求决定了客户来如何调用心知天气的数据接口。对于部分使用天气数据进行数据展示的2C 业务的客户而言,访问量潮汐跟人的行为规律有着明显的相关性,这大致表现为白天比晚上并发量更高;而对于部分使用天气数据做数据分析和研究或者其他需要批量请求天气数据的客户而言,他们大多会选择在整点时刻来批量请求不同的数据,所以整点时刻往往会有突发的高峰访问量。
API 数据服务访问量特点
在叠加了不同客户需求的总体API 服务的访问量,可以看出以下几个特点:
- 以「天」为单位周期性明显
- 每天零点时刻并发量会激增
- 整点和半点时刻存在高并发小周期
只有了解了我们客户的需求特点,才能设计出更合适的技术架构来应对随之而来的挑战。
石器时代
在创业初期,「云计算」的理念开始兴起,创始团队在斟酌优劣之后,选择将整个系统构建于云服务提供商阿里云之上,如此一来心知天气团队也不必自己再手工搭建和管理需要的硬件资源,这对于创业公司而言是一个不错的选择。和大多数早期创业公司一样,囿于资源和技术积累,最早我们也是将API 服务实例直接部署在阿里云ECS 之上,对外通过负载均衡SLB 提供统一的API 入口。
随着心知天气数据服务体验的不断完善,客户数量也不断增多,API 服务所需要承载的流量也持续上涨。由于我们已经构建了上述这样的基础架构体系,在并发量最高的时期,我们需要手工维护高达40 台左右的ECS。而每个ECS 上有自己独立但不完全一致的运行环境,不管是应对访问量突变还是部署新的版本,都无法做到比较快速的响应和执行。
在这个阶段,我们产品的API 数据和逻辑都还比较简单,所有关于用户信息处理、位置服务和数据处理的逻辑都揉杂在一个单体服务中,最终部署时也是一个一个独立的单体式架构通过SLB 共同对外提供服务。
青铜时代
随着心知天气数据种类的不断增多,数据处理和API 服务的逻辑也变得各不相同,比如城市级数据和公里级网格数据就有着完全不一样的处理和取数逻辑。在这种情况下,基于程序的可维护性考虑,我们很快决定根据数据处理逻辑的不同将数据服务拆分为几个不同的微服务,各自对外提供不同的天气数据API。而为了复用取数之前的权限校验、访问量和各种日志统计的逻辑,我们开始引入网关系统。
API 网关最重要的是性能和稳定性要足够好,所有的API 请求都需要经过网关。在通过网关的校验之后,数据服务负责获取需要的天气数据,其结果再通过网关返回给外部用户。如此一来,不同的几个数据服务退化成无状态的纯数据服务,即每个数据服务节点不再考虑任何与用户相关的逻辑,只是简单的根据请求条件将所有处理好的数据从存储系统中取出后返回,网关作为唯一的请求入口来统一处理所有的权限校验和访问量、日志的各种统计。
基于开源的网关系统Kong,我们使用Lua 进行了大量的二次定制开发,从而形成了心知天气自己的一套网关体系。这套系统不仅满足网关基本的路由逻辑,还能更好的处理和我们自身业务深度耦合的用户权限校验、访问量统计以及以用户为核心的日志记录。Kong 天生也是支持集群的,所以在理论上我们可以无限横向扩展网关的处理能力。
在这样的架构之下,心知天气的API服务很好的遵循了「单一职责」的原则,使得我们的代码维护和版本更新都能以更快速且代价更小的方式进行。但另一方面,我们还是需要手工维护大量的ECS 集群,甚至由于天气数据服务的多样化,手工维护多个不同种类服务的集群将面对更繁重的挑战。不过,由于我们将服务进行了更好的拆分和分层,变成了一个个更小的微服务,使得我们能把它们进行更好的分布式部署,进而可以横向扩展来提高整个服务集群处理并发请求的能力。这一阶段既是我们成功像微服务架构的转变阶段,也可以看作是我们迈向更现代的后端架构的过渡阶段。
黄金时代
Cloud-Native 的概念是2015 年被首次提出的,随后就获得了技术社区的大量关注。顺着之前架构演进的思路,我们很快开始用Cloud-Native 的理念来武装整个后端系统架构。在去年,心知天气正式开始用 Docker 和 Kubernetes 来改造和管理所有对外的线上服务,这些架构设计同时也与阿里云提供的云服务深度结合。
从网关到数据服务,目前我们都已经完成了容器化的改造,并且所有服务都使用Kubernetes 来编排和管理,这意味着我们真正统一了各个服务的运行时环境,从而可以快速复制出新的服务节点。借助Kubernetes,心知天气现在可以做到容器级别的自动伸缩,在并发量高的时候服务节点能够自动横向扩展以提高整个集群的并发处理能力,进而可以给用户提供更加优质稳定的天气数据API 服务。
不仅如此,基于Cloud-Native 的理念,我们还统一了各个服务的 CI(持续集成) 流程,优化了 DevOps 的体验,做到所有服务的标准化和归一化—— 从此以往,万物皆容器。这对于今后产品的持续高效迭代和改进,也是意义重大的。
心知天气数据API 产品的高可用之路
总结
心知天气数据API 产品历经十年,其后端架构也逐渐从传统的企业应用的开发模式转变为现代的Cloud-Native 应用的开发模式,不仅极大的解放了团队的产品开发效率,而且能对外提供更加优质稳定的数据服务。心知天气从创立之初就带着鲜明的互联网风格,我们崇尚极客文化,技术团队也将继续带着勇于探索和敢于挑战的极客精神,用更好的技术与更优质的产品,为我们的客户提供更具价值的服务。
心知天气数据API 产品的高并发实践相关推荐
- Android中基于心知天气API获取天气信息
Android中基于心知天气获取天气信息 JSON JSON简介 JSON对象 JSON数组 JSON解析 Android中获取天气 获取天气的流程 获取心知天气的API key 获取心知天气的API ...
- 心知天气api接口怎么用?
心知天气是什么?心知天气提供API吗? 心知天气是国内领先的气象服务商,由中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据.天气监控机器人.气象数据可视化产品, ...
- esp8266获取天气信息:心知天气get及url讲解说明
本人最近在使用esp8266获取天气预报,在网上搜寻了一番,使用了心知天气的api(不是打广告),本人对网络方面不是很懂,经过几天的查找资料与学习,然后在博客记录下,方便以后的学习可广大学友. url ...
- 心知天气API如何调用与json数据如何显示
心知天气官网:https://www.seniverse.com/doc 首先需要注册获得密钥和ID. 因为我不是会员,这里就简单介绍下,怎么调用并显示. Json数据如下图所示: { results ...
- 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api
心知天气 - 免费用户的功能: 国内 370 个主要城市 天气实况,包括天气现象文字.代码和气温 3 项数据 未来 3 天天气预报,包括白天天气现象文字及代码.晚间天气现象文字及代码.当天最高温度和最 ...
- 用cJSON解析心知天气返回的数据包
目录: 文章目录 调用天气API接口获取天气信息 解析天气信息字符串 测试结果 欢迎关注 后台网友留言,说参考这个链接 天气数据解析1–JSON格式数据 处理天气API接口返回的数据,中间遇到了点问题 ...
- 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)
前期准备: 注册心知天气,获取API密钥 https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...
- STM32使用ESP8266模块AT指令连接心知天气API获取天气信息
由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...
- 心知天气api,根据城市名/id查询天气
心知天气api可以根据城市名/id查询天气,向开发者提供的准确.稳定.丰富的天气数据云服务. 接口名称:心知天气api 接口平台:聚合数据 接口地址:http://v.juhe.cn/weather/ ...
- c语言获取天气信息示例(通过心知天气api获取)
关于curl/curl.h库的使用,参考下述内容: VS2010编译libcurl库并简单使用(c语言)_西晋的no1的博客-CSDN博客 1.先在心知天气注册,获取私钥: https://www. ...
最新文章
- 硬核!一文梳理经典图网络模型
- mysql 分支 XtraDB Percona MariaDB 简介
- 11种常见SQLMAP使用方法详解
- 华为光猫鉴权解密逆向
- 机器人峰会王伟_【“峰”景独好】大美中国探春中国机器人峰会举办地——浙江宁波余姚...
- (转)在阿里,我们如何管理代码分支?
- StringBuffer、StringBuilder、冒泡与选择排序、二分查找、基本数据类型包装类_DAY13...
- Rest风格中关于JPA使用懒加载的坑
- CVPR2013感兴趣的文章整理
- ami码编码算法c语言,AMI码编码规则是什么
- 随机森林实现回归预测(糖尿病数据集)
- chrome常用插件-前端-后端-产品 集合推荐
- 深度强化学习-策略梯度算法深入理解
- py文件编译为pyc(命令与脚本)
- 复盘:智能座舱系列文五- 它的3种交互方式之隐式交互
- pq分解法潮流计算的matlab,第四节PQ分解法潮流计算
- 5G DL PRS(Positioning Reference Signal) -- 下行定位参考信号
- win7系统如何关闭广告弹窗操作方法教学
- java通过ip地址获取相应对应的城市
- Zend PDT Eclipse + Zend Server Communication Edition(CE)
热门文章
- 一般来说仿制一个网站大概需要多少钱呢
- 数据分析实战(二) 基于美国人口adult数据集R语言分析实战
- OPPO小布推出预训练大模型OBERT,晋升KgCLUE榜首
- java制作进度条,Java制作进度条
- android 关闭来电铃声,Android删除除自定义铃声后,来电铃声显示是一串数字
- 世界为什么是五彩缤纷
- 原生android7rom大小,红米7原生AOSP刷机包(系统刷机完整固件原生安卓9.0)
- win10删除微软输入法,使用搜狗输入法
- Medical image segmentation
- 基于4G路由器的救护车联网方案:生命,刻不容缓