SlideShare a Scribd company logo
1 of 142
Download to read offline
使用 PostgreSQL 及 MongoDB 從零開始建
置社群必備的按讚追蹤功能
Kewang, Funliday
Kewang
●
王慕羣 Kewang
●
Java / JavaScript
●
HBase / PostgreSQL / MongoDB / Elasticsearch
●
Git / DevOps
●
熱愛開源
Linkedin
Linkedin kewangtw
kewangtw
SlideShare
SlideShare kewang
kewang
Gmail
Gmail cpckewang
cpckewang
Facebook
Facebook Kewang 的資訊進化論
Kewang 的資訊進化論
devopsday taipei
devopsday taipei '17
'17
hadoopcon
hadoopcon '14 '15
'14 '15
jcconf
jcconf '16 '17 '18
'16 '17 '18
modernweb
modernweb '18 '19 '20
'18 '19 '20
GitHub
GitHub kewang
kewang
Funliday
Funliday kewang
kewang
coscup
coscup '20
'20
mopcon
mopcon '14 '20
'14 '20
4
分享的內容
5
這次會提到
6
這次會提到
1. PostgreSQL table 設計
7
這次會提到
1. PostgreSQL table 設計
2. Redis lock 應用
8
這次會提到
1. PostgreSQL table 設計
2. Redis lock 應用
3. Message Queue 發送通知
9
這次會提到
1. PostgreSQL table 設計
2. Redis lock 應用
3. Message Queue 發送通知
4. MongoDB collection 設計
10
這次不會提到
11
這次不會提到
1. Facebook API
12
這次不會提到
1. Facebook API
2. PostgreSQL 及 MongoDB 的維護及參數調校
13
開始
14
按讚前
15
按讚後
16
問題:如何設計資料庫?
17
最直覺的作法: table schema
18
最直覺的作法: table schema
19
最直覺的作法: table schema
20
最直覺的作法:按讚
21
最直覺的作法:按讚
22
最直覺的作法:如何取得按讚數?
23
最直覺的作法:如何取得按讚數?
24
比較好的作法: table schema
25
比較好的作法: table schema
26
比較好的作法: table schema
27
比較好的作法: table schema
28
比較好的作法:按讚
29
比較好的作法:按讚
30
比較好的作法:按讚
31
比較好的作法:如何取得按讚數?
32
比較好的作法:如何取得按讚數?
33
社群網路服務的資料庫設計方式
34
社群網路服務的資料庫設計方式
1.使用者的行為,看文遠大於發文
35
社群網路服務的資料庫設計方式
1.使用者的行為,看文遠大於發文
2.硬碟便宜,空間換取時間
36
社群網路服務的資料庫設計方式
1.使用者的行為,看文遠大於發文
2.硬碟便宜,空間換取時間
3.單一動作多 table 操作,需加上 transaction
37
問題:如何避免重複按讚?
38
使用 lock
39
Simple sequential diagram
client A Redis client A'
40
Simple sequential diagram
client A Redis client A'
acquire lock
41
Simple sequential diagram
client A Redis client A'
acquire lock
acquire success
42
Simple sequential diagram
client A Redis client A'
acquire lock
acquire success
acquire lock
43
Simple sequential diagram
client A Redis client A'
acquire lock
acquire success
acquire lock
acquire fail
44
Simple sequential diagram
client A Redis client A'
acquire lock
acquire success
acquire lock
acquire fail
write to DB
45
Simple sequential diagram
client A Redis client A'
acquire lock
acquire success
acquire lock
acquire fail
write to DB
release lock
46
Simple sequential diagram
client A Redis client A'
acquire lock
acquire success
acquire lock
acquire fail
write to DB
release lock
release success
47
Acquire lock
48
Acquire lock
49
Acquire lock
1. journalid_like : lock 時,同一篇 journal 僅允許按讚一次
2. like_memberid : lock 時,同一人僅允許按讚一次
3. journalid_like_memberid : lock 時,同一篇 journal 僅允許同一人按讚一次
50
Acquire lock
Set if key doesn’t exist
1. journalid_like : lock 時,同一篇 journal 僅允許按讚一次
2. like_memberid : lock 時,同一人僅允許按讚一次
3. journalid_like_memberid : lock 時,同一篇 journal 僅允許同一人按讚一次
51
Acquire lock
Set expire time
Set if key doesn’t exist
1. journalid_like : lock 時,同一篇 journal 僅允許按讚一次
2. like_memberid : lock 時,同一人僅允許按讚一次
3. journalid_like_memberid : lock 時,同一篇 journal 僅允許同一人按讚一次
52
Release lock
53
問題:如何發送 App 通知?
54
Architecture diagram - wrong way
client A server
FCM
client B
55
Architecture diagram - wrong way
client A server
FCM
like req.
client B
56
Architecture diagram - wrong way
client A server
FCM
like req.
client B
FCM req.
57
Architecture diagram - wrong way
client A server
FCM
like req.
like res.
client B
FCM req.
58
Architecture diagram - wrong way
client A server
FCM
like req.
like res.
client B send push
FCM req.
59
Architecture diagram - right way
60
Architecture diagram - right way
client A server MQ
FCM
client B
worker
61
Architecture diagram - right way
client A server MQ
FCM
like req.
client B
worker
62
Architecture diagram - right way
client A server MQ
FCM
like req.
produce job
client B
worker
63
Architecture diagram - right way
client A server MQ
FCM
like req.
produce job
like res.
client B
worker
64
Architecture diagram - right way
client A server MQ
FCM
like req.
produce job
like res. consume job
client B
worker
65
Architecture diagram - right way
client A server MQ
FCM
like req.
produce job
like res. consume job
client B
worker
FCM req.
66
Architecture diagram - right way
client A server MQ
FCM
like req.
produce job
like res. consume job
client B send push
worker
FCM req.
67
Architecture diagram - MQ
68
Architecture diagram - MQ
producer broker consumer
69
Architecture diagram - MQ
producer broker consumer
job
70
Architecture diagram - MQ
producer broker consumer
job job
71
Implementation
72
Implementation
73
Implementation
74
問題:如何讓所有內容都可以按讚?
75
改變資料庫設計
76
改變資料庫設計
77
改變資料庫設計
78
改變資料庫設計
79
共用 API
80
共用 API
81
共用 API
82
共用 API
83
MQ 有多種 producer 及 consumer
84
MQ 有多種 producer 及 consumer
trip producer
product producer
journal producer
85
MQ 有多種 producer 及 consumer
broker
trip producer
product producer
journal producer
86
MQ 有多種 producer 及 consumer
broker trip consumer
trip producer
product producer
journal producer
product consumer
journal consumer
87
問題:如何追蹤使用者?
88
需求
89
需求
1.追蹤後要通知被追蹤者
90
需求
1.追蹤後要通知被追蹤者
2.在首頁能看到被追蹤者近兩週的公開文章
91
需求
1.追蹤後要通知被追蹤者
2.在首頁能看到被追蹤者近兩週的公開文章
3.被追蹤者發文後要即時通知追蹤者
92
追蹤使用者就是對使用者按讚
93
追蹤使用者就是對使用者按讚
94
追蹤使用者就是對使用者按讚
95
首頁 layout 設計方式
96
首頁 layout 設計方式
feature list
popular journal
following
97
首頁 layout 設計方式
feature list
popular journal
following
98
首頁 layout 設計方式
feature list
popular journal
following
存在 MongoDB
99
首頁 layout 設計方式
feature list
popular journal
following
個人化
100
following layout 設計方式
feature list
popular journal
following
101
following layout 設計方式
feature list
popular journal
following
102
following layout 設計方式
feature list
popular journal
following
每日定期清理
103
被追蹤者發文後要即時通知追蹤者
104
被追蹤者發文後要即時通知追蹤者
105
被追蹤者發文後要即時通知追蹤者
106
番外篇: MQ 的應用
107
MQ 的應用
108
MQ 的應用
1.較耗時的工作
109
MQ 的應用
1.較耗時的工作
2.非即時性的工作
110
MQ 的應用
1.較耗時的工作
2.非即時性的工作
3.儲存記錄的工作
111
MQ 不是想用就能用
112
MQ 不是想用就能用
1.業務邏輯要調整
113
MQ 不是想用就能用
1.業務邏輯要調整
2.畫面要調整
114
MQ 不是想用就能用
1.業務邏輯要調整
2.畫面要調整
3.使用者要能忍受非即時性
115
舉例:建立索引
116
舉例:建立索引
117
舉例:建立索引
118
舉例:建立索引
選擇「公開」後,可以在
站內及站外被搜尋到
119
舉例:建立索引
client A server MQ
Elasticsearch worker
120
舉例:建立索引
client A server MQ
Elasticsearch
public req.
worker
121
舉例:建立索引
client A server MQ
Elasticsearch
public req.
produce job
worker
122
舉例:建立索引
client A server MQ
Elasticsearch
public req.
produce job
public res.
worker
123
舉例:建立索引
client A server MQ
Elasticsearch
public req.
produce job
public res. consume job
worker
124
舉例:建立索引
client A server MQ
Elasticsearch
public req.
produce job
public res. consume job
worker
indexing content
125
舉例:計算行程經過的城市
126
舉例:計算行程經過的城市
127
舉例:計算行程經過的城市
景點加入行程後,可以列
出該行程經過的所有城市
128
舉例:計算行程經過的城市
client A server MQ
PostgreSQL worker
129
舉例:計算行程經過的城市
client A server MQ
PostgreSQL
add POI req.
worker
130
舉例:計算行程經過的城市
client A server MQ
PostgreSQL
add POI req.
produce job
worker
131
舉例:計算行程經過的城市
client A server MQ
PostgreSQL
add POI req.
produce job
add POI res.
worker
132
舉例:計算行程經過的城市
client A server MQ
PostgreSQL
add POI req.
produce job
add POI res. consume job
worker
133
舉例:計算行程經過的城市
client A server MQ
PostgreSQL
add POI req.
produce job
add POI res. consume job
worker
query cities from trip
134
Conclusion
135
Conclusion
136
Conclusion
1.為了讓系統變快,反正規化是必要之惡
137
Conclusion
1.為了讓系統變快,反正規化是必要之惡
2.慎選 lock key
138
Conclusion
1.為了讓系統變快,反正規化是必要之惡
2.慎選 lock key
3.善用 MQ 可以加快系統效能
139
工商時間
140
工商時間
https://hahow.in/cr/kewang-backend https://bit.ly/3AueOxt
141
References
1. Distributed locks with Redis
2. The Architecture Twitter Uses To Deal With 150M Active Users,
300K QPS, A 22 MB/S Firehose, And Send Tweets In Under 5 Se
conds
3. BullMQ - Premium Message Queue for NodeJS based on Redis
142

More Related Content

What's hot

高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用redhat9
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)振揚 陳
 
独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐Zheng Biao
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops琛琳 饶
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
Yet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upYet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upWen-Tien Chang
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南Shengyou Fan
 
Http cache 的優化
Http cache 的優化Http cache 的優化
Http cache 的優化振揚 陳
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介琛琳 饶
 
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用redhat9
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践Frank Cai
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践rewinx
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡cachowu
 
gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務升煌 黃
 
Continuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIContinuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIChu-Siang Lai
 

What's hot (18)

高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
 
独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
Yet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upYet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom up
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南
 
Http cache 的優化
Http cache 的優化Http cache 的優化
Http cache 的優化
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介
 
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
ByPat博客出品-高性能Web服务器nginx及相关新技术的应用
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
Ansible 101
Ansible 101Ansible 101
Ansible 101
 
Kafka in Depth
Kafka in DepthKafka in Depth
Kafka in Depth
 
-Nginx book
 -Nginx book -Nginx book
-Nginx book
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
 
gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務
 
Continuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIContinuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CI
 

Similar to 使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能

如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌Mu Chun Wang
 
如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進Mu Chun Wang
 
Continuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIContinuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIChu-Siang Lai
 
初心者 Git 上手攻略
初心者 Git 上手攻略初心者 Git 上手攻略
初心者 Git 上手攻略Lucien Lee
 
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Chu-Siang Lai
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)Chu-Siang Lai
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTreeChu-Siang Lai
 
Mahout資料分析基礎入門
Mahout資料分析基礎入門Mahout資料分析基礎入門
Mahout資料分析基礎入門Jhang Raymond
 
Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Chu-Siang Lai
 
CICD Workshop 20180922
CICD Workshop 20180922CICD Workshop 20180922
CICD Workshop 20180922Earou Huang
 
一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教Bruce Chen
 
Serious clojurescript
Serious clojurescript Serious clojurescript
Serious clojurescript Young Lee
 
Html5研究小组《微周刊》第28期
Html5研究小组《微周刊》第28期Html5研究小组《微周刊》第28期
Html5研究小组《微周刊》第28期chloeguo
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
Scrum essential
Scrum essentialScrum essential
Scrum essential國昭 張
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetupsunng87
 
1.[web security share]google_hacking
1.[web security share]google_hacking1.[web security share]google_hacking
1.[web security share]google_hackingMike Ching
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战icy leaf
 

Similar to 使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能 (20)

如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
 
如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
 
Continuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIContinuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CI
 
初心者 Git 上手攻略
初心者 Git 上手攻略初心者 Git 上手攻略
初心者 Git 上手攻略
 
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTree
 
Swagger
SwaggerSwagger
Swagger
 
Mahout資料分析基礎入門
Mahout資料分析基礎入門Mahout資料分析基礎入門
Mahout資料分析基礎入門
 
Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)
 
Django step0
Django step0Django step0
Django step0
 
CICD Workshop 20180922
CICD Workshop 20180922CICD Workshop 20180922
CICD Workshop 20180922
 
一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教
 
Serious clojurescript
Serious clojurescript Serious clojurescript
Serious clojurescript
 
Html5研究小组《微周刊》第28期
Html5研究小组《微周刊》第28期Html5研究小组《微周刊》第28期
Html5研究小组《微周刊》第28期
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
Scrum essential
Scrum essentialScrum essential
Scrum essential
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetup
 
1.[web security share]google_hacking
1.[web security share]google_hacking1.[web security share]google_hacking
1.[web security share]google_hacking
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 

More from Mu Chun Wang

深入淺出 autocomplete
深入淺出 autocomplete深入淺出 autocomplete
深入淺出 autocompleteMu Chun Wang
 
你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事Mu Chun Wang
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度Mu Chun Wang
 
如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件Mu Chun Wang
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題Mu Chun Wang
 
Git 可以做到的事
Git 可以做到的事Git 可以做到的事
Git 可以做到的事Mu Chun Wang
 
API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一Mu Chun Wang
 
團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作Mu Chun Wang
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務Mu Chun Wang
 
你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?Mu Chun Wang
 
HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者Mu Chun Wang
 
Hedis - GET HBase via Redis
Hedis - GET HBase via RedisHedis - GET HBase via Redis
Hedis - GET HBase via RedisMu Chun Wang
 
104學年度行動裝置程式設計課程說明
104學年度行動裝置程式設計課程說明104學年度行動裝置程式設計課程說明
104學年度行動裝置程式設計課程說明Mu Chun Wang
 
Webduino introduction
Webduino introductionWebduino introduction
Webduino introductionMu Chun Wang
 
Firebase introduction
Firebase introductionFirebase introduction
Firebase introductionMu Chun Wang
 
How to build a scalable SNS via Polling & Push
How to build a scalable SNS via Polling & PushHow to build a scalable SNS via Polling & Push
How to build a scalable SNS via Polling & PushMu Chun Wang
 
How to build a scalable SNS using HBase
How to build a scalable SNS using HBaseHow to build a scalable SNS using HBase
How to build a scalable SNS using HBaseMu Chun Wang
 

More from Mu Chun Wang (20)

深入淺出 autocomplete
深入淺出 autocomplete深入淺出 autocomplete
深入淺出 autocomplete
 
你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
 
如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
 
Git 可以做到的事
Git 可以做到的事Git 可以做到的事
Git 可以做到的事
 
API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一
 
團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務
 
你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?
 
HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者
 
Hedis - GET HBase via Redis
Hedis - GET HBase via RedisHedis - GET HBase via Redis
Hedis - GET HBase via Redis
 
104學年度行動裝置程式設計課程說明
104學年度行動裝置程式設計課程說明104學年度行動裝置程式設計課程說明
104學年度行動裝置程式設計課程說明
 
Webduino introduction
Webduino introductionWebduino introduction
Webduino introduction
 
Lightning Hedis
Lightning HedisLightning Hedis
Lightning Hedis
 
職涯之路
職涯之路職涯之路
職涯之路
 
Firebase introduction
Firebase introductionFirebase introduction
Firebase introduction
 
How to build a scalable SNS via Polling & Push
How to build a scalable SNS via Polling & PushHow to build a scalable SNS via Polling & Push
How to build a scalable SNS via Polling & Push
 
How to build a scalable SNS using HBase
How to build a scalable SNS using HBaseHow to build a scalable SNS using HBase
How to build a scalable SNS using HBase
 

使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能