SlideShare a Scribd company logo
使用 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
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
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 (20)

PDF
Blazing Performance with Flame Graphs
Brendan Gregg
 
PDF
Git을 조금 더 알아보자!
Young Kim
 
PDF
PDSを実現するにあたっての技術動向の紹介 (OAuth, OpenID Connect, UMAなど)
Tatsuo Kudo
 
PDF
Faster packet processing in Linux: XDP
Daniel T. Lee
 
PDF
[CB21] The Lazarus Group's Attack Operations Targeting Japan by Shusei Tomona...
CODE BLUE
 
PDF
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
tobaru_yuta
 
PPTX
php and sapi and zendengine2 and...
do_aki
 
PDF
Presentation de nagios mohamed bouhamed
TECOS
 
PDF
Geep networking stack-linuxkernel
Kiran Divekar
 
PDF
OWASP Secure Coding Practices - Quick Reference Guide
Ludovic Petit
 
PPTX
Format String Attack
Mayur Mallya
 
PDF
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
PPTX
Windows Kernel Exploitation : This Time Font hunt you down in 4 bytes
Peter Hlavaty
 
PDF
Install and Configure RSyslog – CentOS 7 / RHEL 7
VCP Muthukrishna
 
PPTX
Debug dpdk process bottleneck & painpoints
Vipin Varghese
 
PDF
Résumé vlsm et cidr
Boubaker KHERFALLAH
 
ODP
Sql lite android
Dushyant Nasit
 
PDF
High-Precision GPS Positioning for Spring Developers
VMware Tanzu
 
PPTX
Intro to exploits in metasploitand payloads in msfvenom
Siddharth Krishna Kumar
 
PDF
Fun with Network Interfaces
Kernel TLV
 
Blazing Performance with Flame Graphs
Brendan Gregg
 
Git을 조금 더 알아보자!
Young Kim
 
PDSを実現するにあたっての技術動向の紹介 (OAuth, OpenID Connect, UMAなど)
Tatsuo Kudo
 
Faster packet processing in Linux: XDP
Daniel T. Lee
 
[CB21] The Lazarus Group's Attack Operations Targeting Japan by Shusei Tomona...
CODE BLUE
 
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
tobaru_yuta
 
php and sapi and zendengine2 and...
do_aki
 
Presentation de nagios mohamed bouhamed
TECOS
 
Geep networking stack-linuxkernel
Kiran Divekar
 
OWASP Secure Coding Practices - Quick Reference Guide
Ludovic Petit
 
Format String Attack
Mayur Mallya
 
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
Windows Kernel Exploitation : This Time Font hunt you down in 4 bytes
Peter Hlavaty
 
Install and Configure RSyslog – CentOS 7 / RHEL 7
VCP Muthukrishna
 
Debug dpdk process bottleneck & painpoints
Vipin Varghese
 
Résumé vlsm et cidr
Boubaker KHERFALLAH
 
Sql lite android
Dushyant Nasit
 
High-Precision GPS Positioning for Spring Developers
VMware Tanzu
 
Intro to exploits in metasploitand payloads in msfvenom
Siddharth Krishna Kumar
 
Fun with Network Interfaces
Kernel TLV
 

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

PDF
Mysql HandleSocket技术在SNS Feed存储中的应用
iammutex
 
PDF
Scaling Offline Database Usage On GCP @ Dcard
Jui An Huang (黃瑞安)
 
PDF
Nosql及其主要产品简介
振林 谭
 
PDF
老司機帶你上手 PostgreSQL 關聯式資料庫系統
Mu Chun Wang
 
PDF
RESTful API Design
Amigo 陳兆祥
 
PDF
Douban qcon2009 beijing
drewz lin
 
PDF
优酷 Web网站架构案例分析
George Ang
 
PDF
Youku arch qcon2009_beijing
drewz lin
 
PDF
Key value store
xuanhan863
 
PPTX
Nosql三步曲
84zhu
 
PDF
美丽说的架构发展与变迁 New
翀 刘
 
PPTX
Mongo db 特性
Hermes Chiang
 
PPTX
MOPCON 2012 - 網路服務從 K 到 M
ericpi Bi
 
PDF
如何在有限資源下實現十年的後端服務演進
Mu Chun Wang
 
PDF
Introduction to CodeIgniter
Chun-Kai Wang
 
PPT
Bluemix Node-Red Part I
Joseph Chang
 
PPTX
Another Introduce to Redis
jiaqing zheng
 
PDF
Qcon 2011:Beansdb 的设计与实现
Davies Liu
 
PDF
MySQL 網路參考架構
郁萍 王
 
PDF
Res tful api design tw-2.0
昀陞 李
 
Mysql HandleSocket技术在SNS Feed存储中的应用
iammutex
 
Scaling Offline Database Usage On GCP @ Dcard
Jui An Huang (黃瑞安)
 
Nosql及其主要产品简介
振林 谭
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
Mu Chun Wang
 
RESTful API Design
Amigo 陳兆祥
 
Douban qcon2009 beijing
drewz lin
 
优酷 Web网站架构案例分析
George Ang
 
Youku arch qcon2009_beijing
drewz lin
 
Key value store
xuanhan863
 
Nosql三步曲
84zhu
 
美丽说的架构发展与变迁 New
翀 刘
 
Mongo db 特性
Hermes Chiang
 
MOPCON 2012 - 網路服務從 K 到 M
ericpi Bi
 
如何在有限資源下實現十年的後端服務演進
Mu Chun Wang
 
Introduction to CodeIgniter
Chun-Kai Wang
 
Bluemix Node-Red Part I
Joseph Chang
 
Another Introduce to Redis
jiaqing zheng
 
Qcon 2011:Beansdb 的设计与实现
Davies Liu
 
MySQL 網路參考架構
郁萍 王
 
Res tful api design tw-2.0
昀陞 李
 
Ad

More from Mu Chun Wang (20)

PDF
深入淺出 autocomplete
Mu Chun Wang
 
PDF
你畢業後要任職的軟體業到底都在做些什麼事
Mu Chun Wang
 
PDF
網路服務就是一連串搜尋的集合體
Mu Chun Wang
 
PDF
Funliday 新創生活甘苦談
Mu Chun Wang
 
PDF
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
Mu Chun Wang
 
PDF
如何使用 iframe 製作一個易於更新及更安全的前端套件
Mu Chun Wang
 
PDF
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
Mu Chun Wang
 
PDF
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
Mu Chun Wang
 
PDF
Google Maps 開始收費了該怎麼辦?
Mu Chun Wang
 
PDF
Git 可以做到的事
Mu Chun Wang
 
PDF
那些大家常忽略的 Cache-Control
Mu Chun Wang
 
PDF
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
Mu Chun Wang
 
PDF
如何與全世界分享你的 Library
Mu Chun Wang
 
PDF
如何與 Git 優雅地在樹上唱歌
Mu Chun Wang
 
PDF
API Blueprint - API 文件規範的三大領頭之一
Mu Chun Wang
 
PDF
團體共同協作與版本管理 - 01認識共同協作
Mu Chun Wang
 
PDF
Git 經驗分享
Mu Chun Wang
 
PDF
手把手教你如何串接 Log 到各種網路服務
Mu Chun Wang
 
PDF
你有想過畢業九年後的你會變什麼樣子嗎?
Mu Chun Wang
 
PDF
HR Search - 輕鬆管理面試者
Mu Chun Wang
 
深入淺出 autocomplete
Mu Chun Wang
 
你畢業後要任職的軟體業到底都在做些什麼事
Mu Chun Wang
 
網路服務就是一連串搜尋的集合體
Mu Chun Wang
 
Funliday 新創生活甘苦談
Mu Chun Wang
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
Mu Chun Wang
 
如何使用 iframe 製作一個易於更新及更安全的前端套件
Mu Chun Wang
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
Mu Chun Wang
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
Mu Chun Wang
 
Google Maps 開始收費了該怎麼辦?
Mu Chun Wang
 
Git 可以做到的事
Mu Chun Wang
 
那些大家常忽略的 Cache-Control
Mu Chun Wang
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
Mu Chun Wang
 
如何與全世界分享你的 Library
Mu Chun Wang
 
如何與 Git 優雅地在樹上唱歌
Mu Chun Wang
 
API Blueprint - API 文件規範的三大領頭之一
Mu Chun Wang
 
團體共同協作與版本管理 - 01認識共同協作
Mu Chun Wang
 
Git 經驗分享
Mu Chun Wang
 
手把手教你如何串接 Log 到各種網路服務
Mu Chun Wang
 
你有想過畢業九年後的你會變什麼樣子嗎?
Mu Chun Wang
 
HR Search - 輕鬆管理面試者
Mu Chun Wang
 
Ad

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