App後臺Keynote

App後臺Keynote算法

1、基礎。數據庫

  一、一個 節省 流量 的 處理 方法 是 讓 App 下載 通過 壓縮 的 圖片( 通常 是 幾十 KB 如下), 當 用戶 須要 查看 原圖 時 才 下載 原圖。api

  二、Openfire( Openfire 是一 個 開源 的 聊天 服務器)。緩存

  三、在 www. sosoapi. com 中 能夠 管理 建立 的 全部 接口。安全

  四、當 App 客戶 端 須要 某種 尺寸 的 圖片, 由 App 客戶 端 通知 服務 端 所需 圖片 的 尺寸, 由 服務 端 動態 生成 並 緩存。服務器

  五、返回 信息 最 科學 的 狀況 是 App 後臺 只 返回 信息 代碼, 具體 的 文字 提示 由 App 客戶 端 決定。網絡

  六、爲了 避免 同一個 App 客戶 端 中 調用 不一樣 版本 的 API, 通常 會 所有 升級 API 的 版本。架構

  七、MongoDB併發

    1)MongoDB 同時 使用 了 硬盤 和 內存, 其 使用 了 操做系統 提供 的 MMAP( 內存 文件 映射) 機制 進行 數據 文件 的 讀寫, MMAP 能夠 把 文件 直接 映射 到 進程 的 內存 空間 中。運維

    2)MongoDB 能夠 查找 在某 個 矩形 範圍內 的 全部 座標, 所以 MongoDB 很是 適合於 LBS 應用。

    3)MongoDB 不適用於事務型、複雜SQL查詢的場景。

  八、MySQL

    1)MySQL 的 數據 是 放在 硬盤 中。 雖然 MySQL 也有 緩存, 但 MySQL 緩存 的 是 查詢 的 結果, 而 不是 緩存 數據。

    2)事務性,複雜SQL。

  九、有大 量 開源 的 應用 可做 爲 消息 隊列 的 服務 端, 例如 RabbitMQ ,ZeroMQ ,Redis 等。

  十、IETF 就在 1999 年 把 SSL 協議 標準化。 SSL 協議 標準化 以後 的 名稱 改成 TLS( Transport Layer Security) 協議, 中文 稱爲「 傳輸 層 安全 協議」。

2、

  一、FFmpeg 的 官 網( http:// ffmpeg. org/) 是 這樣 介紹 的: A c omplete, c ross- platform s olution t o record, convert and stream audio and video。

  二、FastDFS 是一 個 開源 的 輕量級 分佈式 文件 系統。

  三、推薦 使用 GraphicsMagick 做爲 圖片 處理 軟件, 其是 一個 久經考驗 的 軟件, 支持 多個 平臺, 支持 多種 語言 客戶 端, 處理 速度快, 消耗 資源 少, 而且 規模 較大 的 圖片 網 站 如 Flickr 都在 使用 GraphicsMagick。

  四、CDN 最大 的 做用 是 使 圖片、 音頻、 視頻 等 靜態 文件 下載 速度 更快, 用戶 體驗 更好。App 後臺 訪問 量大 時 經過 CDN, 能夠 把 圖片、 音頻、 視頻 等 靜態 文件 請求 提早 響應, 不讓 其 到達 應用 服務器, 也是 一種 應付 高 併發 的 方法。

  五、ELK (Logstash+ ElasticSearch+ Kibana) 這個 分佈式 的 日誌 收集 和 分析 系統。

 3、

  一、查詢 系統 文件 描述 符 大小 的 命令 以下。

[root@ modecron]# ulimit -n 
1024

  二、top 命令 提供 實時 的 系統 處理器 的 狀態 監視。

  三、殭屍 進程 指的 是 那些 已經 終止, 但 仍然 保留 一些 信息 的 進程, 等待 父 進程 爲 其 調用 wait() 系統 調用 來 獲取 子 進程 的 退出 狀態 和 其餘 的 信息( 即爲 其 掃尾)。 當 調用 父 進程 爲 其 調用 wait() 後, 殭屍 進程 就 徹底 從 內存 中 移 除。

    殭屍 進程 沒法 使用 kill 清理。 若是 開發者 須要 手動 清理 殭屍 進程, 要找 到 其父 進程, 把 父 進程 kill 掉 後 Linux 的 init 將 接管 其 子 進程。

  四、lsof( list open files) 是一 個 列出 當前 系統 打開 文件 的 工具。

  五、supervisor 是 用 Python 語言 編寫 的 基於 Linux 操做系統 的 一 款 進程 管理 工具, 用於 監控 進程 的 運行, 當 發現 進程 閃 退 時能 自動 重 啓。

  六、Nginx 的 高性能 主 要是 其 使用 了 epoll、kqueue。 Apache 所 採用 的 select 網絡 I/ O 模型 是非 常 低效 的。

 4、MySql

  一、MySQL 在 架構 上 分爲 三層。

    1)服務層/鏈接層。

    2)核心層。

    3)存儲引擎層。

  二、MySQL 被 Oracle 收購 後, MySQL 創始人 Monty W idenius 主導 開發 了 MariaDB, 採用 GPL 受權 許可, 徹底 兼容 MySQL, 使用 XtraDB 存儲 引擎 來 代替 MySQL 的 InnoDB 存儲 引擎。

  三、MyISAM 基於 ISAM( 索引 順序 訪問 方法) ,支持 全文 索引, 但 並不是 是 事務 安全, 不支持 外 鍵, 使用 表 級 鎖。

    每一個 MyISAM 表 存有 3 個 文件:

    1)FRM 文件 存放 表 結構。

    2)MYD 文件 存放 數據。

    3)MYI 存放 索引。

  四、InnoDB 是 事務 型 存儲 引擎, 其 支持 行 鎖。

  五、讀寫分離/主從架構。

    MySQL 主從 複製 是 異步 複製, 在 主 數據 與 從 數據庫 之間 實現 整個 主從 複製 的 過程 有 三個 線程 參與, 其中 兩個 線程( SQL 線程 和 IO 線程) 在 從 數據庫, 另外 一個 線程( IO 線程) 在 主 數據。


      

5、Redis

  一、提供 了 AOF 和 RDB 兩種 數據 的 持久 化 方式, 保證 了 Redis 重 啓 後 數據 不 丟失。

  二、Redis 的 全部 操做 都是 原子 性, 同時 Redis 還 支持 對 幾個 操做 合併 後的 原子 性 操做, 也即 支持 事務。

  三、list 在 Redis 中 是 鏈 表 結構。

  四、能夠設置超時時間,超過 超時 時間 後, 該 Key 與 對應 的 數據 會被 Redis 刪除。 經過 刪除 過時 的 Key, 能夠 在 必定程度 上 優化 內存 的 使用。

  五、Twemproxy 是由 Twitter 開源 的 Redis 代理, 其 基本 原理 是: Redis 客戶 端 把 請求 發送 到 Twemproxy, Twemproxy 根據 路 由 規則 發送 到 正確 的 Redis 實例, 最後 Twemproxy 把 結果 聚集 返回 給 客戶 端。

    Twemproxy 經過 引入 了 一個 代理 層, 將 多個 Redis 實例 進行 統一 管理, 使 Redis 客戶 端 只需 要在 Twemproxy 上進 行 操做, 而 不須要 關心 後面 有 多少 個 Redis 實例, 從而 實現 了 Redis 的 集羣。

  六、Twemproxy 不能 平滑 增長 Redis 實例 的 問題 帶來 了 很大 的 不便, 因而 豌豆莢 自主 研發 了 Codis, 一個 支持 平滑 增長 Redis 實例 的 Redis 代理 軟件, 其 基於 Go 和 C 語言 開發, 並於 2014 年 11 月 在 Github 上 開源。

  七、持久化:

    1)RDB 是 Redis 默認 的 持久 化 方式, 這種 方式 是按 照 必定 的 時間 週期 策略 把 內存 的 數據 以 快照 的 形式 寫入 到 硬盤 的 二進制 文件。 RDB 默認 的 數據 文件 是 dump. rdb,

    2)使用 AOF 的 持久 化 方式, Redis 會把 每一個 寫入 命令 經過 write 函數 追加 到 持久 化 文件 中( 默認 文件 是 Appendonly. aof), 當 Redis 重 啓 的 時候 會 經過 執行 持久 化 文件 的 寫 命令 重建 內存 數據。

      爲了 壓縮 AOF 文件, Redis 提供 了 bgrewriteaof 命令, Redis 收到 這個 命令 後 會 以 相似 建立 RDB 文件 的 方式 將 內存 數據 以 命令 的 形式 保存 到 臨時 文件 中, 最後 替換 原 文件。

6、MongoDB

  MongoDB 有兩 個 基本 的 組件。

    1)mongod: MongoDB 服務 端 程序, 啓動 MongoDB 的 服務。

    2)mongo: MongoDB 客戶 端 程序, 鏈接 mongod 服務 端 進行 相關 的 管理 工做。

 

  一、是非 關係 型 數據庫 當中 功能 最 豐富、 最 像 關係 型 數據庫 的 數據庫。

  二、全球 流行 的 LBS 應用 foursquare, 國內 的 快的 打車 和 滴滴 打車( 如今 這 兩家 公司 已 合併) 都曾 經 選擇 了 MongoDB 處理 LBS。

  三、副本 集 使用 多臺 機器 作 同一 份 數據 的 異步 同步, 從而 使 多臺 服務器 擁有 同一 份 數據 的 多個 副本。 一臺 服務器 做爲 主 節點 提供 寫入 服務, 多臺 服務器 做爲 副本 節點 提供 讀取 服務, 實現 讀寫 分離。

     當 主 節點 宕 機 後, 能夠 在 不須要 用戶 干預 的 狀況下 把 一臺 副本 節點 或 其餘 節點 提高 爲主 節點, 繼續 提供 服務。

      

  四、MongoDB 分片 的 架構。

    1)mongos: 做爲 數據庫 集羣 請求 的 入口, 因爲 數據 已經 分佈 在 shard 服務器 上, 全部 請求 通過 mongos 轉發 到 shard 服務器 上, mongos 充當 路 由 的 角色。

    2)config server: 配置 服務器, 存儲 了 全部 數據庫 元 信息( 路 由、 分片) 的 配置。

      

 

7、聊天后臺架構

  1)心跳。

     

  2)圖片、音頻等大文件的處理。

     

  3)聊天后臺架構。

     

8、社交後臺架構。

  一、帶虛擬結點的一致性hash算法。

    

  二、主、 從 緩存 結構 中 從 緩存 是 做爲 主 緩存 的 備份 存儲。 大部分 的 請求 都 落在 主 緩存, 只有 少 部分 的 請求 會 落在 從 緩存, 這 形成了 主從 緩存 數據 的 剔除、 過時 策略 不一致。 若是 主 緩存 出了 問題, 請求 落在 從 緩存, 但在 從 緩存 上 只有 少 部分 數據 可供 訪問, 請求 仍是 會 穿透 到 數據庫, 所以 從 緩存 做爲 防止 單 點 失效 的 措施 是 無效 的。

    一種解決方案。應用 層 控制 請求 有 必定 的 機率 落在 從 緩存, 讓 從 緩存 承擔 部分 請求, 使 從 緩存 中的 數據 不 過冷。

    

    

9、LBS後臺架構。

  一、geohash

    1)geohash 編碼, 就是 經過 算法 把 地理 座標 轉換 成 一個 值, 簡單 點 來講 就是 把 二維 座標 轉換 成 一個 字符串。如座標 是「 113. 39175, 23. 061784」, 這個 座標 同時 也可 以用 geohash 值「 ws0ehq32ek0u」 表示。

    2)座標 的 geohash 值 越 類似, 意味着 距離 越 相近。

    3)geohash 值 越長, 表示 的 範圍 越 精確。

  二、MongoDB3. 0 的 WiredTiger 存儲 引擎, 該 款 存儲 引擎 支持 了 文檔級別的鎖

  三、MongoDB 的 一大 亮點 是 封裝 了 大量 的 地理 位置 操做, 全球 流行 的 LBS 服務「 Foursquare」、 國內 著名 的 打車 App「 快的」 也曾 經 使用 MongoDB 的 地理 位置 查詢 功能。

 10、推送後臺架構。

  一、因爲 iOS 系統 的 限制, 應用 是 不容許 在後 臺 運行 並 鏈接 網絡 的。 若是 App 在 iOS 上 沒有 運行, 可是 開發者 卻 想 推送 消息 給 使用 該 App 的 iOS 用戶, 只能 經過 APNS 推送 消息。

    

  二、Android 手機 因爲 Android 系統 沒有 限制, 當 App 進入 了 後臺 也能 運行 服務, 因此 Android 能夠 基於 長 鏈接 做 推送。

    

11、

  一、高性能。

  二、高可用。

    高 可用 就是 要 保證 爲 App 提供 7 × 24 小時 服務 的 App 後臺, 服務器 不能 隨便 宕 機, 或者 在 一個 服務器 集羣 中, 部分 服務器 宕 機 了 也能夠 保證 整個 服務 不 受到影響。

    保證 負載 均衡 策略 有效 的 核心 是 應用 層 必須 是 無 狀態 的。 所謂 無 狀態, 是指 任意 一臺 應用 服務器 上 不會 保存 用戶 的 狀態 信息( 例如, 在 某臺 服務器 上 保存 用戶 已經 登陸 的 憑證)。 用戶 的 狀態 信息 能夠 存儲 在 緩存 或 數據庫, 供 全部 的 應用 服務器 共同 調用。

  三、可伸縮。

    可伸縮 是指 經過 往 集羣 中 添加 機器, 應付 不斷 增大 的 訪問 壓力 和數 據 存儲 需求。

  四、可擴展。

    可擴展 性的 核心 是 減小 模塊 間的 耦合 度, 每一個 模塊 都 儘可能 少 依賴 其餘 模塊, 這樣 其中 一個 模塊 的 變化 對其 他 模塊 的 影響 減小。

  五、安全性。

 

參考:

一、《App後臺開發運維和架構實踐》

相關文章
相關標籤/搜索