最近本風流才子重出江湖,不做朋友圈段子手,決定開始好好寫文章了,大家好好看好好學吧!
近半年來收集了一系列大廠技術 blog,斷斷續續在小本本上寫了一些筆記,是時候整理一下了,爭取日更。
PostgreSQL 調參
原文連結
摘要:PostgreSQL 預設的配置並沒有為應用做特殊的最佳化,然而有許多參數是有最佳化空間的,譬如:
shared_buffer
PostgreSQL 有兩級緩衝,自己的緩衝 shared_buffer 和核心緩衝。為了在什麼爛機器上都能跑,shared_buffer 的預設值設的很小。調節 shared_buffer 會非常有效。推薦值是系統記憶體的 25%
wal_buffers
WAL = write ahead log,預寫式日誌,From Wiki:
在使用WAL的系統中,所有的修改在提交之前都要先寫入log檔案中。log檔案中通常包括redo和undo資訊。假設一個程式在執行某些操作的過程中機器掉電了。在重新啟動時,程式可能需要知道當時執行的操作是成功了還是部分成功或者是失敗了。如果使用了WAL,程式就可以檢查log檔案,並對突然掉電時計劃執行的操作內容跟實際上執行的操作內容進行比較。在這個比較的基礎上,程式就可以決定是撤銷已做的操作還是繼續完成已做的操作,或者是保持原樣。
在這些日誌被寫入磁碟之前有這個 buffer,如果並發串連很多,可以調大
effective_cache_size
給 PostgreSQL 一個 disk caching 的估計,如果實際能使用的其實很大,然而估計值很小,那麼效能就會受損失
work_mem
可以用來 in memory sort 的記憶體大小,如果 query 經常有 in memory sort,可以最佳化
maintenance_work_mem
預留來 VACUUM, RESTORE, CREATE INDEX, ADD FOREIGN KEY,ALTER TABLE 這種事的記憶體,調大可以最佳化這些任務
synchronous_commit
2 中提到了 WAL,synchronous_commit 控制 commit 之前是否等所有的操作寫進了 WAL,是一個效能上的取捨。
checkpoint_timeout,checkpoint_completion_target
Issue 一個 checkpoint IO 代價很高,我們希望儘可能地 smooth,checkpoint_timeout 要盡量短,checkpoint_completion_target 如果我理解正確的話也要盡量短
用 React Native 開發 iOS 的得失
原文連結
優勢:
- 開發效率高,Debug 容易。和開發 web 一樣,修改之後重新整理即可見,不需要編譯,Chrome 裡 F12 即可調試
- 不需要太多 ios 知識,React 的知識可以遷移過來
- Flex box,一個新的 css module: https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox 很好用
劣勢:
- React library 升級太快,好多東西 break 了
- 因為太新,好多本該內建的功能卻需要第三方 library 的支援
- 一些動畫的坑
總結:It's worth it(不虧)!
Twitch 對 gRPC 架構的改造
原文連結
structured RPC 是好的,老鼠台的道友們之前想用 gRPC,後來發現有問題,原因如下:
- 缺少 HTTP 1.1 支援,gRPC 只支援 http2,但是現有很多的 load balancer 之類的只支援 http 1.1
- 產生的 runtime 過大,且有時候舊版 client 無法相容新版 server,會 break 東西(我強烈懷疑他們是不是開啟的方法不對)
- 產生的 runtime 過大,很難理解,有 bug 很難改
- gRPC 只支援 binary 的 payload,直接操作 binary 很不方便
最後老鼠台用 Golang 內建的支援 http 1.1 的 http server,json,以及 protobuf,重新寫了一套系統:Twirp,實現了如下約定:
- The URL is
/twirp/twitch.users.email.EmailBoss/UpdateEmail
.
- The HTTP Method is
POST
, because it’s always POST
.
- The body of the message should be a protobuf
UpdateEmailRequest
.
- The body should be encoded either in binary or in JSON.
- The request should have a Content-Type header set to either
application/protobuf
or application/json
, matching the encoding of the body.
- The response body will be a protobuf
UpdateEmailResponse
, encoded in the same way as the request.
- If there is an error, it will be JSON encoded, including a message and a standardized error code.
感想:有時候一個技術是好的,但是由於 infrastructure 跟不上,可能給你你也用不了……
Uber 使用 NLP 協助客服處理 ticket
原文連結
隨著 Uber 的發展,ticket 數量的增加,人工處理起來很困難了,Uber 實現了一套簡單可行的 NLP 方法
- 對於每個使用者的 ticket,使用 SVD 和 TF-IDF 提取特徵
- 使用餘弦相似性找出前 3 近似的見過的 ticket
- 將推薦結果返回給客服人員
感想:簡單粗暴的辦法,其實在工業界上可以滿足一定的需求,並不需要煉丹