心知天氣數據API 產品的高併發實踐

来源:https://www.cnblogs.com/seniverse/archive/2019/05/09/10838099.html
-Advertisement-
Play Games

心知天氣數據API 的QPS 在高峰時期已經達到數千的量級,如何承載這樣海量的併發請求,使客戶能穩定及時的獲取到所需數據自然也是心知技術團隊一路以來不斷探索的主題。 ...


心知天氣數據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 應用的開發模式,不僅極大的解放了團隊的產品開發效率,而且能對外提供更加優質穩定的數據服務。心知天氣從創立之初就帶著鮮明的互聯網風格,我們崇尚極客文化,技術團隊也將繼續帶著勇於探索和敢於挑戰的極客精神,用更好的技術與更優質的產品,為我們的客戶提供更具價值的服務。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • demo 省: 市: 區: ...
  • 通過一個月以來對HTML5+CSS的學習。這篇隨筆給大家來做一個簡單的網頁中常見的導航欄。 這些都稱之為網頁中的導航欄。 我簡單的做了一個某寶和58同城的導航欄,供大家學習參考。 一、58同城導航欄: 解析:首先我們來看到這個導航欄,我們可以把它分成兩個部分 左邊為一部分,右邊為一部分。把導航欄拆分 ...
  • 前面 接著上一節的內容來,今天我們要完成一個用Node開發後臺伺服器,實現一個簡單的用戶評論社區。可以先看下效果圖: 開始 1. 建立項目文件夾 ,在裡面新建一個 文件夾, 文件夾存放我們允許客戶端訪問的資源,這裡是公開的。 文件是我們服務端代碼。 在 文件中放的是網站的首頁內容,這裡採用 框架快速 ...
  • 先以一道面試題做引子: 寫出這段程式的輸出內容: 如果你看了這道題不知道怎麼下手,或者發現結果和自己的答案大相徑庭,請繼續往下看 1. javascript事件迴圈首先,你要知道javascript是單線程語言。js任務需要排隊順序執行,如果一個任務耗時過長,後邊一個任務也的等著,但是,假如我們需要 ...
  • 在開發中,一個好的用戶操作界面,總會夾雜著一些動畫。css用對少的代碼,來給用戶最佳的體驗感,下麵我總結了一些css動畫屬性的使用方法及用例代碼供大家參考,在不對的地方,希望大佬直接拍磚評論。 1 transition(過渡) 使用語法: 參數: (1) property(設置過渡效果的css屬性名 ...
  • 服務目錄 服務目錄對應的介面是Directory,這個介面里主要的方法是 List list(Invocation invocation) throws RpcException; 列出所有的Invoker,對於服務消費端而言,一個Invoker對應一個可用的服務提供者,底層封裝了一個tcp連接。當 ...
  • 一、枚舉的定義 枚舉是一組命名整型常量。枚舉類型是使用 enum 關鍵字聲明的。 C# 枚舉是值類型。換句話說,枚舉包含自己的值,且不能繼承或傳遞繼承。 二、枚舉的聲明 聲明枚舉的一般語法: enum <enum_name> { enumeration list }; 其中, enum_name 指 ...
  • 一直以來,自己讀過的技術類書籍也不少了,但是都犯了一個毛病就是沒有很好的記錄下來,有些東西可能並不是平日開發中時時刻刻用到的,隨著時間的延長,學過的東西慢慢也就淡忘了,剛好最近有些時間,也正打算把<<設計模式之禪>>這本書好好的通讀一遍,順便把所想所得詳細的記錄一下,也方便以後查閱和回顧。 好,以上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...