心知天气数据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 产品的高并发实践的更多相关文章
- NodeMCU获取并解析心知天气信息
NodeMCU获取并解析心知天气信息 1 注册心知天气并获取私钥 打开心知天气网站,点击注册按钮 填写基本信息注册心知天气账号,登录注册所填写的邮箱点击链接进行账号激活,随后出现如下界面 点击登录按钮 ...
- PHP解决网站大数据大流量与高并发
1:硬件方面 普通的一个p4的服务器每天最多能支持10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬盘读写 ...
- Linux服务器高并发实践经历
作为一个师父离职早的野生程序员,业务方面还可以达到忽悠别人的水平,但上升到性能层面那就是硬伤. 真实天上掉馅饼,公司分配了一个测试性能的任务,真是感觉我的天空星星都亮了. 高并发主要限制因素:CPU. ...
- Nginx Ingress 高并发实践
概述 Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分 ...
- PHP 网站大数据大流量与高并发 笔记
前端: 1.域名开启cdn 2.大文件使用oss php: 1.模板编译缓存 服务器: 1.负载均衡 数据库: 1.读写分离 待完善
- HttpClient 在vivo内销浏览器的高并发实践优化
作者:vivo 互联网服务器团队- Zhi Guangquan HttpClient作为Java程序员最常用的Http工具,其对Http连接的管理能简化开发,并且提升连接重用效率:在正常情况下,Htt ...
- angular框架下的跨域问题(获取天气数据)
1.新浪天气:http://php.weather.sina.com.cn/iframe/index/w_cl.php?code=js&day=0&city=&dfc=1&am ...
- php如何处理大数据高并发
大数据解决方案 使用缓存: 使用方式:1,使用程序直接保存到内存中.主要使用Map,尤其ConcurrentHashMap. 使用缓存框架.常用的框架:Ehcache,Memcache,Redis等. ...
- 高并发&高可用系统的常见应对策略
解耦神器:MQ MQ是分布式架构中的解耦神器,应用非常普遍.有些分布式事务也是利用MQ来做的.由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后 ...
随机推荐
- 后退欧拉法求解常微分方程(c++)
#include<iostream> #include<iomanip> using namespace std; int main() { double x,y,yn,h,t ...
- iOS9 TableView和ScrollView滚动不响应问题
今天开始适配iOS9,发现在有UITableView或是ScrollView的界面滚动不灵敏有些卡顿,研究了下是因为tableview的cell里有可以相应点击事件的Button,当我点击到Butto ...
- mongodb设置 十个要点
mongodb设置 十个要点 一.对象ID的生成 每一个mongoDB文档那个都要求有一个主键.它在每一个集合中对全部的文档必须是唯一的.主键存放在文档_id字段中.由12个字符组成: 4c291 ...
- 在evernote中如何使序号正常连续?
答: 在二级内容之前按Shift + Enter键,再次换行即可序号正常,示例如下: 1. 第一行(在此处按下Shift+Enter键) 第一行第一列(在此处按下Shift+Enter键) 第一行第二 ...
- openresty开发系列31--openresty执行流程
openresty开发系列31--openresty执行流程 我们先看个例子 location /test { set $a 32; echo $a; set $a 56; e ...
- docker安装并运行elasticsearch
拉取镜像: [mall@VM_0_7_centos ~]$ [sudo] password for mall: : Pulling from library/elasticsearch 256b176 ...
- 10分钟完成一个最最简单的BLE蓝牙接收数据的DEMO
这两天在研究蓝牙,网上有关蓝牙的内容非常有限,Github上的蓝牙框架也很少很复杂,为此我特地写了一个最最简单的DEMO,实现BLE蓝牙接收数据的问题, 不需要什么特定的UUID, 不需要什么断开重连 ...
- accept 和 content-Type区别
accept表示 客服端(浏览器)支持的类型,也是希望服务器响应发送回来的的数据类型. 例如:Accept:text/xml; ,也就是希望服务器响应发送回来的是xml文本格式的内容 区别: 1.Ac ...
- [LeetCode] 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- 玩转CONSUL(3)–大规模部署的性能开销定量分析
1. 引言 今天有朋友问萌叔,consul能否在大规模生产环境下进行应用.场景是总计大约10w+台机器,分为3 ~ 4个机房,单个机房最多3w万+机器.这个问题大的,可把萌叔吓了跳,部门里面consu ...