心知天气数据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 产品的高并发实践的更多相关文章

  1. NodeMCU获取并解析心知天气信息

    NodeMCU获取并解析心知天气信息 1 注册心知天气并获取私钥 打开心知天气网站,点击注册按钮 填写基本信息注册心知天气账号,登录注册所填写的邮箱点击链接进行账号激活,随后出现如下界面 点击登录按钮 ...

  2. PHP解决网站大数据大流量与高并发

    1:硬件方面 普通的一个p4的服务器每天最多能支持10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬盘读写 ...

  3. Linux服务器高并发实践经历

    作为一个师父离职早的野生程序员,业务方面还可以达到忽悠别人的水平,但上升到性能层面那就是硬伤. 真实天上掉馅饼,公司分配了一个测试性能的任务,真是感觉我的天空星星都亮了. 高并发主要限制因素:CPU. ...

  4. Nginx Ingress 高并发实践

    概述 Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分 ...

  5. PHP 网站大数据大流量与高并发 笔记

    前端: 1.域名开启cdn 2.大文件使用oss php: 1.模板编译缓存 服务器: 1.负载均衡 数据库: 1.读写分离 待完善

  6. HttpClient 在vivo内销浏览器的高并发实践优化

    作者:vivo 互联网服务器团队- Zhi Guangquan HttpClient作为Java程序员最常用的Http工具,其对Http连接的管理能简化开发,并且提升连接重用效率:在正常情况下,Htt ...

  7. angular框架下的跨域问题(获取天气数据)

    1.新浪天气:http://php.weather.sina.com.cn/iframe/index/w_cl.php?code=js&day=0&city=&dfc=1&am ...

  8. php如何处理大数据高并发

    大数据解决方案 使用缓存: 使用方式:1,使用程序直接保存到内存中.主要使用Map,尤其ConcurrentHashMap. 使用缓存框架.常用的框架:Ehcache,Memcache,Redis等. ...

  9. 高并发&高可用系统的常见应对策略

    解耦神器:MQ MQ是分布式架构中的解耦神器,应用非常普遍.有些分布式事务也是利用MQ来做的.由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后 ...

随机推荐

  1. Cloudera-Manager(一) —— 基本概念及使用

    概念 Cloudera Manager(简称CM)是Cloudera公司开发的一款大数据集群安装部署利器,这款利器具有集群自动化安装.中心化管理.集群监控.报警等功能,极大的提高集群管理的效率. AP ...

  2. Java与.net 关于URL Encode 的区别

    在c#中,HttpUtility.UrlEncode("www+mzwu+com")编码结果为www%2bmzwu%2bcom,在和Java开发的平台做对接的时候,对方用用url编 ...

  3. [转]centos sqlite3安装及简单命令

    安装: 方法一: wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz tar xvzf sqlite-autoconf-3070500. ...

  4. ISO/IEC 9899:2011 摘要

    本国际标准指定了C编程语言的形式并建立了对用它所表达的程序的解释.其目的在于促进在多种计算机系统上的C语言程序的可移植性.可靠性.可维护性以及高效的执行. 为了详细地说明C语言本身以及C语言执行库,包 ...

  5. 010-MySQL批量插入测试数据

    1.由于测试需要 需要将数据插入到百万级别,故需要使用循环语句,循环参看:009-MySQL循环while.repeat.loop使用 方式三.使用values批量插入[[推荐答案]] 基础格式 IN ...

  6. [简短问答]C-Lodop中一些测试用的地址

    测试访问:访问http://localhost:8000欢迎页面试试进入欢迎页面http://localhost:8000,点欢迎页面的预览试试 查看下c-lodop启动界面,在设置里查看下当前启动的 ...

  7. css3逐帧动画

    写css3动画的时候,我们经常用到animation来实现,默认情况下,animation是属于连贯性的ease动画.我们熟悉的animation动画有ease.ease-in.ease-out.li ...

  8. [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  9. [LeetCode] 375. Guess Number Higher or Lower II 猜数字大小 II

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  10. Node.js 多线程完全指南

    [原文] 很多人都想知道单线程的 Node.js 怎么能与多线程后端竞争.考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉.要想知道原因,必须理解其单线程的真正含义. Jav ...