通用圖牀服務架構解析(百萬級回源/天)

Hulk 圖牀是支持 360 公司絕大部分業務的圖片服務,支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計算、人臉識別、格式轉換、gif 首幀提取……等等,支持的業務線包括:搜索、圖搜、新聞、信息流、廣告……等等,天天 CDN 回源圖牀後端 150+ 億 PV。前端

圖牀業務邏輯相對簡單,抽象看就是:上傳和下載,這裏簡單分享圖牀這兩個模塊的架構以及圖片的上傳和下載時所經歷的服務。後端

1. 上傳模塊(Davinci)

圖片描述
【Davinci 架構圖】緩存

業務上傳圖片到圖牀邏輯大體以下:架構

  1. SDK 上傳
    經過 SDK (或者業務本身構造 HTTP 請求)將圖片 POST 到 Davinci 上傳接口 ,接口域名解析的 VIP 均衡到後端 Nginx (80 端口)。負載均衡

  2. Nginx:80 轉發
    Nginx 80 經過 upstream,將請求經過負載均衡,均衡給後端處理的服務(Nginx 8360) 。異步

  3. 排隊等待上傳處理
    後端服務將上傳任務進行排隊,等待 Gearman 異步服務進行隊列消費和任務調度,同時給該上傳請求返回任務 ID,用於查詢處理結果。spa

  4. 圖片初始處理和存儲
    Gearman worker 異步對圖片進行處理,好比壓縮、初始裁剪、人臉識別等,並將圖片以及圖片處理後的元信息落地存到 Cassandra。將任務 ID 對應的處理結果,存在 Redis,用於提供用戶查詢。blog

  5. 獲取上傳結果
    經過 <iii> 中獲取的任務 ID,獲取圖片上傳和處理結果。接口

PS: 圖牀同時也支持同步上傳、回調通知的方式,將圖片上傳結果反饋給業務方。隊列

2. 下載模塊(Picasso)

圖片描述
【Picasso 架構圖】

用戶經過 URL 請求圖牀的一張圖片,大體流程以下:

  1. 圖片 URL 請求
    圖片 URL 根據圖牀域名 CNAME 配置,請求到 CDN 節點。若是所請求的 CDN 節點已緩存過該圖片,則直接返回數據。

  2. CDN 回源
    若是 中沒命中 CDN 緩存,將會回源到圖牀後端(Nginx 80 端口)。

  3. 圖牀後端緩存(Varnish)
    爲了減小圖牀後端的計算壓力,圖片請求回源到圖牀後端時,並非直接到存儲集羣讀圖片、處理圖片,而是先經過 varnish 前端緩存服務,若是 varnish 緩存命中,則直接響應圖片數據。

  4. Varnish 緩存沒命中
    若是 varnish 緩存沒命中,則轉發給 Nginx 8360 端口,進而轉發給 PHP fast-cgi 進行圖片讀取和響應。

  5. 圖片處理
    在 <iii> 中讀取了圖片數據,會在 Nginx (8360)這層的 filter 模塊進行處理,處理規則是在圖片 URL 的參數中指定。好比:指定裁剪寬高、濾鏡、黑白、人臉裁剪、gif 首幀提取等等,這個 filter 模塊主要是使用了開源的 GraphicsMagick 進行圖片處理,靜態編譯到 Nginx。

  6. 響應處理後的數據
    經過 Nginx (8360)這層模塊的處理,獲得符合 URL 指定規則的圖片,最後響應並緩存到 CDN 節點。

以上就是圖牀上傳和下載模塊的處理邏輯。

相關文章
相關標籤/搜索