最近要替我們的服務加一個類似公告的服務,想了好幾個solution,譬如說在我們既有的API Server上加一隻API,讓前端獲取目前最新的公告,
但這麼做的缺點就是前端得用pulling or long pulling的方式,不管哪個方式對Server來說都是一種負擔,再加上把公告的獲取放在API Server的話,又得處理zero downtime的問題,基於以上的原因,所以打算使用Firebase realtime database。
Firebase realtime database是一個即時的資料庫,當你更改任一個在database的值時,會立即的同步到各個已經連結到資料庫上的client上面,傳統作法是得讓client自己定期去DB query,而Firebase會主動的讓各個client知道,然後目前已經支援非常多種client了,像是普遍的iOS, Android,而我這篇是選擇使用Web,我可以在前端頁面上,使用JavaScript與Firebase realtime database做一個連結。
由於我們的服務都是由n台API Server + 各個client (Android, iOS, HTML5)所組成,然後我們的服務在某些國家是不開放的,所以勢必得做到block by country,然後又要有白名單機制;做法有很多種,但都大同小異,譬如說用iptables, nginx,然後搭配一些IP to country module(ip2location, GeoIP)去阻擋,這篇就會使用Nginx + GeoIP來阻擋。
1. Check Nginx version
首先先看看你安裝的Nginx是否有支援geoip
這功能,如果有grep
東西出來就代表有支援。
$ nginx -V 2>&1 | tr ' ' '\n' | grep geoip
--with-http_geoip_module
1. What’s fluentd?
fluentd是一個用來搜集data的open source,以及可以對搜集來的data進行簡單的分析,
甚至可以把搜集來的data再foward出去mongodb, Elasticsearch, S3, GCP…etc.
因為我們的API有好多台,在管理log時非常不方便,必須ssh進去每一台看,或者scp出來,這方法實在太落後,
因此最近才把fluentd整進來,我們應用的情景如下:
- 安裝一台Log Server (儲存所有API上的log)
- 每一台API Server都裝有fluentd,並且把本地的log foward to Log Server
- 把本地的Log上傳至S3備份