SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
在 GCP 上,對 OLTP
資料庫擴展分析型查詢
Ruian Huang @ Dcard Plaza / Golang Taipei Gathering #42. 2019-06-18
1
⼤大家好
* 畢業於交⼤大資⼯工

* Dcard 架構團隊的後端⼯工程師

* ⽇日常⼯工作是開發內外部 API

資料庫查詢優化

Infrastructure as Code

* 愛好是吃甜食

* 右邊是我哥的貓,被我當頭像

* https://github.com/rueian
2
外部使⽤用者
資料庫
⼀一般 Online Transaction Processing 情境
外部使⽤用者僅透過公開 API ,

發起預先寫好的查詢存取有限的資料
公開 API
3
外部使⽤用者
資料庫
⼀一般 Online Transaction Processing 情境
外部使⽤用者僅透過公開 API ,

發起預先寫好的查詢存取有限的資料
公開 API
資料庫則針對這情境做最佳化,包含:



* 多連線的硬體資源分配

* 資料庫對硬碟隨機存取的參參數

* 資料 Indexing

* 資料 Partitioning

* 資料 Clustering

* 查詢優化 (Index Scan)
4
外部使⽤用者
資料庫
公開 API
內部員⼯工
來來⾃自內部員⼯工的隨機分析型查詢怎辦呢?
問題
5
內部需求包含:

* 排程任務

* 報表

* 送批量量通知

* 模型訓練

* ETL
內部的分析型查詢
通常需要掃描⼤大量量資料,

可能還會有⼤大量量計算會佔據⼤大量量硬體資源

(Seq Scan, Postgres Bitmap Heap Scan)
* ⼈人⼯工 Ad-hoc 查詢

* 成效統計、數據研究

* 開發功能、Debug
6
外部使⽤用者
資料庫
公開 API
我們以前的作法
7
外部使⽤用者
資料庫
公開 API
我們以前的作法
內部查詢的唯讀資料庫
Streaming WAL
為了了避免內部查詢影響到外部使⽤用者,

我們建立⼀一台內部專⽤用的唯讀副本資料庫
8
外部使⽤用者
資料庫
公開 API
我們以前的作法
內部查詢的唯讀資料庫
Streaming WAL
內部⼯工具
9
Master
問題
Slave
Streaming WAL
1. Slave 通常被要求硬體規格與 Master 同等,

甚⾄至可能⼀一些資料庫參參數會被要求跟 Master ⼀一樣,

沒辦法在參參數上針對分析型查詢做優化。

2. Slave 是唯讀,無法在資料上對分析型查詢做優化。

3. Slave 閒置時也不能關機,不然追同步很⿇麻煩。

4. Slave 只有⼀一台,分析型查詢全都擠在上⾯面互相拖慢,

卻很難快速⽣生出第⼆二台、第三台,且同步 WAL 對 Master 負擔也不⼩小。10
Master
問題
Slave
Streaming WAL
在查詢 PostgreSQL Slave 上還有⼀一個問題:
除了了在 Slave 不斷重試查詢之外沒有對 Master 不造成影響的解法

然⽽而不斷重試可能也只是不斷撞到⼀一樣的情況







https://www.postgresql.org/docs/current/hot-standby.html#HOT-STANDBY-CONFLICT11
願望
* 讓同事開⼼心:

* 查詢想怎麼下就怎麼下

* 想查什什麼資料庫就查什什麼庫

* 資源隔離

不⽤用怕影響別⼈人。

* 讓老闆開⼼心:盡量量節省成本。
12
快照
⼤大部分虛擬化平台或是雲端廠商
都有硬碟增量量快照功能可以使⽤用
13
現在的做法
資料庫
定期打快照
14
現在的做法
資料庫
定期打快照
內部需求
15
現在的做法
資料庫
db proxy
定期打快照
內部需求
16
現在的做法
資料庫
db proxy
resource management api
定期打快照
內部需求
17
現在的做法
資料庫
db proxy
resource management api
內部⼯工具
定期打快照
內部需求
18
現在的做法
資料庫
db proxy
resource management api
內部⼯工具
請求資料庫
定期打快照
內部需求
19
現在的做法
資料庫
db proxy
resource management api
找最新的快照
內部⼯工具
請求資料庫
定期打快照
內部需求
20
現在的做法
資料庫
db proxy
resource management api
先佔資料庫
⽤用快照創新的先佔資料庫內部⼯工具
請求資料庫
定期打快照
內部需求
21
現在的做法
資料庫
db proxy
resource management api
先佔資料庫
內部⼯工具 執⾏行行查詢
Heartbeat
定期打快照
內部需求
22
現在的做法
資料庫
db proxy
resource management api
內部⼯工具
執⾏行行查詢
Heartbeat
定期打快照
內部需求
先佔資料庫23
Resource Management API
resource management api
外部需可以接受不同種類資源請求
24
Resource Management API
resource management api
外部需可以接受不同種類資源請求
25
Resource Management API
resource management api
內部則需可以管理理不同種類的資源
26
Resource Management API
resource management api
內部則需可以管理理不同種類的資源
-> ⽤用 plugin ⽅方式實作不同種類的 resource controller 

⽤用 plugin 的⽅方式可以:

1. 獨立於主程式

2. 不限定實作程式語⾔言

3. 各別 resource controller 可以 Hot Reload 或分開部署
27
Resource Management API
resource management api
各別 Resource Controller 需實做的介⾯面:
* FindResource 負責回應前⾯面的 RequestResource 請求,

從給定的 ResourcePool 之中挑出可⽤用的 Resource 回傳,

或是也可以回傳⼀一個全新的 Resource。

* SyncResource 則負責檢查 Resource 狀狀態並回傳更更新的 Resource。

會有額外的 Worker 會不斷對現有的 Resource 

去呼叫對應 Controller 的 SyncResource 來來更更新狀狀態
28
Resource Management API & Resource Controller Plugin
resource management api
RequestResource A
resource A controller
29
resource management api
RequestResource A
resource A controller
FindResource A
Resource Management API & Resource Controller Plugin
30
resource management api
RequestResource A
resource A controller
return a
Resource Management API & Resource Controller Plugin
31
resource management api
return a
resource A controller
Resource Management API & Resource Controller Plugin
32
resource management api resource A controller
SyncResource a
Resource Management API & Resource Controller Plugin
33
resource management api resource A controller
return a with new state
Resource Management API & Resource Controller Plugin
34
resource management api resource A controller
SyncResource a
Resource Management API & Resource Controller Plugin
35
resource management api resource A controller
return a with delete mark
Resource Management API & Resource Controller Plugin
36
實作 Resource Controller
37
實作 Resource Controller
38
Startup-Script
⼤大部分虛擬化平台或雲端廠商都
有提供 startup-script 讓你在 VM
開機之後可以執⾏行行創建 VM 時注
入的腳本。

startup-script 很適合⽤用在根據不
同硬體規格來來⾃自動調整相關參參數
然後再啟動服務。
39
⼤大部分虛擬化平台或雲端廠商都
有提供 startup-script 讓你在 VM
開機之後可以執⾏行行創建 VM 時注
入的腳本。

startup-script 很適合⽤用在根據不
同硬體規格來來⾃自動調整相關參參數
然後再啟動服務。
Startup-Script
PostgreSQL 為例例:

Linux Kernel:
/proc/sys/vm/nr_hugepages
PostgreSQL config:
max_connections
shared_buffers
effective_cache_size
maintenance_work_mem
work_mem
max_worker_processes
max_parallel_workers_per_gather
random_page_cost
effective_io_concurrency
PostgreSQL Data:
create index on table
cluster table using index
analyze database
40
db proxy
db proxy
41
db proxy
db proxy
負責服務來來⾃自使⽤用者的資料庫連線,隱藏背後處理理過程。

負責根據連線內容來來跟 resource management api 索取資源。



也負責對 resource management api 進⾏行行 heartbeat

讓 resource controller 可以知道 resource 還有⼈人在使⽤用
42
db proxy
db proxy
StartupMessage
username=ooo

database=xxx
resource
management api
RequestResource

database=xxx
43
db proxy
db proxy
StartupMessage
username=ooo

database=xxx
resource
management api
return Resource

addr=10.x.x.x:5432
44
db proxy
db proxy
StartupMessage
username=ooo

database=xxx
先佔資料庫
StartupMessage
username=ooo

database=xxx
addr=10.x.x.x:5432
45
db proxy
db proxy
StartupMessage
username=ooo

database=xxx
先佔資料庫
AuthenticationOk
addr=10.x.x.x:5432
46
db proxy
db proxy
AuthenticationOk
先佔資料庫
AuthenticationOk
addr=10.x.x.x:5432
47
db proxy
db proxy
Query
先佔資料庫
Query
addr=10.x.x.x:5432
48
Library
* ⽤用來來處理理 Postgres Startup Message 的 PGResolver interface

* ⽤用來來處理理 Postgres Cancel Request 的 InMemoryConnInfoStore

* ⽤用來來處理理各種 Postgres Message 的 Message Handler

⾃自⼰己寫 proxy 可以拿來來做很多事情:

* Query logging, auditting, retry transaction if preemptible instance disappeared

* Data logging, auditting, masking, obscuring

* Separate authentication from database
https://github.com/rueian/pgbroker

⽤用來來寫 postgres proxy 的 golang library,提供:
!49
Library
* 對內的 Service 層以及對外的 HTTP transport 層實作,以及 golang 的 client library

* 使⽤用 redis 的 Resource Store 以及 Resource Controller Locker 

* golang 的 Resource Controller Plugin Skeleton Library

* 類似 hashicorp/go-plugin 的 Plugin Launchpad,⽤用來來管理理 subprocess 形式的 Resource
Controller

* Resource Syncer ⽤用來來不斷呼叫 Resource Controller 的 SyncResource

* OpenCensus 的 metric view,可輸出⾄至 Stackdriver 或轉成 Prometheus 格式
https://github.com/rueian/godemand

⽤用來來寫 resource management api 的 golang library,提供:
!50
範例例實作
https://github.com/rueian/godemand-example

節合 godemand 以及 pgbroker,並實作 pg resource
controller plugin 的範例例:

* 可部屬於 GKE

* 從 GCP Project 上⾯面新的 snapshot 開 pg instance,⽤用
startup-script 根據硬體調整參參數

* resource controller ⽤用 /proc/loadavg 檢查 vm 負載來來決定
是否加開 pg
!51
總結
* 透過 db proxy 隱藏背後與 resource mangement api 的互動,讓使⽤用者使⽤用⼀一般的 db client 與
proxy 連線就可以取⽤用從最新的 snapshot 開啟的 db instance。

* 透過 db proxy 與 resource management api 的 Heartbeat 機制,resource controller 可以控制
⼀一個 db instance 要服務多久。不僅 db instance 可以使⽤用 Preemptible 機器,閒置時可以直接
關機,甚⾄至直接刪除以降低成本,當新的連線進來來再重新開機或從 snapshot 開新的機器即可。

* resource controller 可以檢查當前 db instance 負載決定是否加開機器,並且可以再開機器時決
定硬體規格與 startup-script 內容,達到按需求動態調整花費。

* 從 snapshot 開的 db instance 不再是原 db 的 hot standby replica,因此可以根據之後的查詢
需求做參參數與資料上的調整,例例如 postgres 可以降低 max_connection 並提⾼高 work_mem,或
是 create index 或是 cluster table。

* 當沒有查詢時,不再需要像原本 hot standby replica ⼀一直把 db instance 開著保持同步了了。僅
需要開著 db proxy 與 resource management api 兩兩隻 process,相當省錢。
!52
下⼀一步
* ⽀支援 mongo db 

* 更更進⼀一步⾃自動優化 cost & waiting time
!53
https://join.dcard.today/
!54

Más contenido relacionado

La actualidad más candente

GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢apkiban
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
Boost Your Neo4j with User-Defined Procedures
Boost Your Neo4j with User-Defined ProceduresBoost Your Neo4j with User-Defined Procedures
Boost Your Neo4j with User-Defined ProceduresNeo4j
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Takuya Ueda
 
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Shinnosuke Tokuda
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発Takafumi ONAKA
 
實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)Gelis Wu
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
go generate 完全入門
go generate 完全入門go generate 完全入門
go generate 完全入門yaegashi
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015Toru Yamaguchi
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
Transpilers Gone Wild: Introducing Hydra
Transpilers Gone Wild: Introducing HydraTranspilers Gone Wild: Introducing Hydra
Transpilers Gone Wild: Introducing HydraJoshua Shinavier
 

La actualidad más candente (20)

GDB Rocks!
GDB Rocks!GDB Rocks!
GDB Rocks!
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Boost Your Neo4j with User-Defined Procedures
Boost Your Neo4j with User-Defined ProceduresBoost Your Neo4j with User-Defined Procedures
Boost Your Neo4j with User-Defined Procedures
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
 
nginx入門
nginx入門nginx入門
nginx入門
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
go generate 完全入門
go generate 完全入門go generate 完全入門
go generate 完全入門
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
Transpilers Gone Wild: Introducing Hydra
Transpilers Gone Wild: Introducing HydraTranspilers Gone Wild: Introducing Hydra
Transpilers Gone Wild: Introducing Hydra
 

Similar a Scaling Offline Database Usage On GCP @ Dcard

Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer TalkLarry Cai
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdfssuserd6c7621
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027Wei Sun
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)Wei Sun
 
未来网络技术发展探梦 - 开篇
未来网络技术发展探梦 - 开篇未来网络技术发展探梦 - 开篇
未来网络技术发展探梦 - 开篇Yao-Wei Ou
 
Using google appengine_final
Using google appengine_finalUsing google appengine_final
Using google appengine_finalWei Sun
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 
FeatHub_DataFun_2023.pptx
FeatHub_DataFun_2023.pptxFeatHub_DataFun_2023.pptx
FeatHub_DataFun_2023.pptxDong Lin
 
JCConf 2015 TW 高效率資料爬蟲組合包
JCConf 2015 TW 高效率資料爬蟲組合包JCConf 2015 TW 高效率資料爬蟲組合包
JCConf 2015 TW 高效率資料爬蟲組合包書豪 李
 
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?Andy Dai
 
Cncf k8s Ingress Example-03
Cncf k8s Ingress Example-03Cncf k8s Ingress Example-03
Cncf k8s Ingress Example-03Erhwen Kuo
 
LINE Messaging API with LinkIt 7697
LINE Messaging API with LinkIt 7697 LINE Messaging API with LinkIt 7697
LINE Messaging API with LinkIt 7697 CAVEDU Education
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xBo-Yi Wu
 
FeatHub_GAIDC_2022.pptx
FeatHub_GAIDC_2022.pptxFeatHub_GAIDC_2022.pptx
FeatHub_GAIDC_2022.pptxDong Lin
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化Mu Chun Wang
 
Ops as Code using Serverless
Ops as Code using Serverless Ops as Code using Serverless
Ops as Code using Serverless Rick Hwang
 

Similar a Scaling Offline Database Usage On GCP @ Dcard (20)

Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer Talk
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)
 
未来网络技术发展探梦 - 开篇
未来网络技术发展探梦 - 开篇未来网络技术发展探梦 - 开篇
未来网络技术发展探梦 - 开篇
 
Using google appengine_final
Using google appengine_finalUsing google appengine_final
Using google appengine_final
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
FeatHub_DataFun_2023.pptx
FeatHub_DataFun_2023.pptxFeatHub_DataFun_2023.pptx
FeatHub_DataFun_2023.pptx
 
JCConf 2015 TW 高效率資料爬蟲組合包
JCConf 2015 TW 高效率資料爬蟲組合包JCConf 2015 TW 高效率資料爬蟲組合包
JCConf 2015 TW 高效率資料爬蟲組合包
 
該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
 
Cncf k8s Ingress Example-03
Cncf k8s Ingress Example-03Cncf k8s Ingress Example-03
Cncf k8s Ingress Example-03
 
LINE Messaging API with LinkIt 7697
LINE Messaging API with LinkIt 7697 LINE Messaging API with LinkIt 7697
LINE Messaging API with LinkIt 7697
 
Berserk js
Berserk jsBerserk js
Berserk js
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
 
FeatHub_GAIDC_2022.pptx
FeatHub_GAIDC_2022.pptxFeatHub_GAIDC_2022.pptx
FeatHub_GAIDC_2022.pptx
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
 
Hadoop ecosystem
Hadoop ecosystemHadoop ecosystem
Hadoop ecosystem
 
Ops as Code using Serverless
Ops as Code using Serverless Ops as Code using Serverless
Ops as Code using Serverless
 

Más de Jui An Huang (黃瑞安)

Más de Jui An Huang (黃瑞安) (8)

Golang PostgreSQL Libraries Comparasion With Wireshark
Golang PostgreSQL Libraries Comparasion With WiresharkGolang PostgreSQL Libraries Comparasion With Wireshark
Golang PostgreSQL Libraries Comparasion With Wireshark
 
Www 2017第二次新生訓練:系統設計
Www 2017第二次新生訓練:系統設計Www 2017第二次新生訓練:系統設計
Www 2017第二次新生訓練:系統設計
 
Www 2017第一次新生訓練:系統分析
Www 2017第一次新生訓練:系統分析Www 2017第一次新生訓練:系統分析
Www 2017第一次新生訓練:系統分析
 
Www 2017第三次新生訓練:transaction, migration, worker
Www 2017第三次新生訓練:transaction, migration, workerWww 2017第三次新生訓練:transaction, migration, worker
Www 2017第三次新生訓練:transaction, migration, worker
 
Elasitcsearch + Logstash + Kibana 日誌監控
Elasitcsearch + Logstash + Kibana 日誌監控Elasitcsearch + Logstash + Kibana 日誌監控
Elasitcsearch + Logstash + Kibana 日誌監控
 
Elasticsearch 簡介
Elasticsearch 簡介Elasticsearch 簡介
Elasticsearch 簡介
 
Docker應用
Docker應用Docker應用
Docker應用
 
Git 版本控制 (使用教學)
Git 版本控制 (使用教學)Git 版本控制 (使用教學)
Git 版本控制 (使用教學)
 

Scaling Offline Database Usage On GCP @ Dcard