Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Golang 
PostgreSQL Libraries Comparison With Wi...

Rueian
June 23, 2020

Golang 
PostgreSQL Libraries Comparison With Wireshark

透過 Wireshark 比較 lib/pq, gorm, go-pg, pgx 實作上的差異,希望能幫助大家了解各個 library 如何與資料庫溝通。

Medium 版:
https://medium.com/dcardlab/postgresql-%E4%BD%BF%E7%94%A8-extended-query-protocol-%E9%81%BF%E5%85%8D%E9%A0%BB%E5%AF%AC%E8%88%87%E6%95%88%E8%83%BD%E6%B5%AA%E8%B2%BB-b708af73882e

Rueian

June 23, 2020
Tweet

More Decks by Rueian

Other Decks in Technology

Transcript

  1. Ruian Huang @Golang Taipei 2020/06/23 Golang 的熱⾨ 
 PostgreSQL Library

    比較 透過觀察封包比較實作上的差異
  2. 我們希望這些 lib 能幫我們做什麼?怎麼做的? • 傳送 SQL 讀取結果 -> ⽤什麼形式? •

    Printable SQL Representation? • 預防 SQL Injection -> 怎麼預防的? • Parameter Placeholder?
  3. 範例 Users 表 先插入⼀個有 200 bytes 的 secret 的 foo

    user 然後⽤不同 lib 讀出來看看
  4. go-pg 預設即便使⽤ Parameter Placeholder 寫法,
 依然使⽤ Simple Query 與 PG

    溝通。
 SQL Injection 的防範仰賴 go-pg 做正確的參數跳脫
  5. Extended Query Protocol 的好處 • 避免 SQL Injection • 重複利⽤

    Parse 結果? • Binary Format 節省頻寬?
  6. PostgreSQL Binary Format vs Text Format Binary Format Size Text

    Format Size Text Example UUID 16 bytes 36 bytes d4d1d263-4f5c-49bb -ae36-1e26d4adf44a Timestampz 8 bytes ~ 30 bytes 2020-06-22 17:16:28.87282+00 Bigint 8 bytes 1 ~ 19 bytes 9223372036854775807 Bytea Variable Hex
 2x size \x1feb6644e0
  7. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary Data

    Result 重複使⽤ Parse lib/pq V gorm V go-pg X pgx V
  8. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary Data

    Result 重複使⽤ Parse lib/pq + Parepare - X Bytea Only lib/pq + Parepare binary_parameters=yes - Bytea Only Bytea Only gorm(lib/pq) V gorm(lib/pq) + binary_parameters=yes V go-pg X pgx V
  9. gorm 與 lib/pq 比較特別的是
 當不使⽤ Prepare 顯興呼叫,並且開啟
 binary_parameters 後,P/B/D/E 這幾個


    訊息會⼀起送給 PG,取得結果只有 1 RTT
 
 但 Bytea 的回傳它會改回使⽤ Hex Format
  10. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary
 Data

    Result RTT 重複使⽤ Parse lib/pq + Parepare - X Bytea Only 2 lib/pq + Parepare binary_parameters= yes - Bytea Only Bytea Only 2 gorm(lib/pq) V X Bytea Only 2 gorm(lib/pq) + binary_parameters= yes V Bytea Only X 1 go-pg X pgx V
  11. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary
 Data

    Result RTT 重複使⽤ Parse lib/pq + Parepare - X Bytea Only 2 lib/pq + Parepare binary_parameters= yes - Bytea Only Bytea Only 2 gorm(lib/pq) V X Bytea Only 2 gorm(lib/pq) + binary_parameters= yes V Bytea Only X 1 go-pg + Parepare - X X 2 pgx V
  12. pgx

  13. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary
 Data

    Result RTT 重複使⽤ Parse lib/pq + Parepare - X Bytea Only 2 lib/pq + Parepare binary_parameters= yes - Bytea Only Bytea Only 2 gorm(lib/pq) V X Bytea Only 2 gorm(lib/pq) + binary_parameters= yes V Bytea Only X 1 go-pg + Parepare - X X 2 pgx V 70 types 70 types 2
  14. lib/pq 將 Connection Pool ⼤⼩設定成 2
 並送 6 個慢 query

    觀察 lib/pq 如何使⽤
 Extended Query Protocol
  15. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary
 Data

    Result RTT(重複使⽤) 重複使⽤ Parse lib/pq + Parepare - X Bytea 2(1) V lib/pq + Parepare binary_parameters= yes - Bytea Bytea 2(1) V gorm(lib/pq) V X Bytea 2 X gorm(lib/pq) + binary_parameters= yes V Bytea X 1 X go-pg + Parepare - X X 2 pgx V 70 types 70 types 2
  16. 這是因為 go-pg 在 prepare stmt 創建的的當下
 會立刻綁定⼀個 connection 給它。
 


    這個 stmt 雖然可以 concurrently 呼叫,但它的
 concurrency 被限制在只有 1,容易有效能問題。
  17. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary
 Data

    Result RTT(重複使⽤) 重複使⽤ Parse lib/pq + Parepare - X Bytea 2(1) V lib/pq + Parepare binary_parameters= yes - Bytea Bytea 2(1) V gorm(lib/pq) V X Bytea 2 X gorm(lib/pq) + binary_parameters= yes V Bytea X 1 X go-pg + Parepare - X X 2(1) concurrency=1 pgx V 70 types 70 types 2
  18. pgx

  19. Extended Query Protocol 的⽀援程度 ⾃動使⽤ EQP Binary Parameter Binary
 Data

    Result RTT(重複使⽤) 重複使⽤ Parse lib/pq + Parepare - X Bytea 2(1) V lib/pq + Parepare binary_parameters= yes - Bytea Bytea 2(1) V gorm(lib/pq) V X Bytea 2 X gorm(lib/pq) + binary_parameters= yes V Bytea X 1 X go-pg + Parepare - X X 2(1) concurrency=1 pgx V 70 types 70 types 2(1) V
  20. Q&A