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

PDF
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
PDF
Power Query Online
PDF
자바 직렬화 (Java serialization)
PPTX
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
PDF
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
PDF
Go 製リアルタイムサーバーの Kubernetes での運用について
PDF
Docker国内外本番環境サービス事例のご紹介
PDF
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barce...
Power Query Online
자바 직렬화 (Java serialization)
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Go 製リアルタイムサーバーの Kubernetes での運用について
Docker国内外本番環境サービス事例のご紹介
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉

What's hot (20)

PDF
MongoDB Oplog入門
PPTX
このPHP QAツールがすごい!2019
PPTX
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
PDF
C# における Redis 徹底活用
PDF
オープンソースNW監視ツールのご紹介
PDF
Airflow at lyft for Airflow summit 2020 conference
PDF
게임 애셋 스트리밍 패치
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
POTX
Performance Tuning EC2 Instances
PDF
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
PPTX
NLP techniques for log analysis
PDF
DockerからKubernetesへのシフト
PDF
KubernetesとSpannerで 進化し続けるコロプラのゲーム開発
PDF
ハイブリッド時代のID基盤構成の基礎
PDF
20191115-PGconf.Japan
PDF
An Insider’s Guide to Maximizing Spark SQL Performance
PPTX
Data Stream Processing with Apache Flink
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PPTX
NDC 11 자이언트 서버의 비밀
PDF
Redmineとgitの 連携利用事例
MongoDB Oplog入門
このPHP QAツールがすごい!2019
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
C# における Redis 徹底活用
オープンソースNW監視ツールのご紹介
Airflow at lyft for Airflow summit 2020 conference
게임 애셋 스트리밍 패치
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Performance Tuning EC2 Instances
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
NLP techniques for log analysis
DockerからKubernetesへのシフト
KubernetesとSpannerで 進化し続けるコロプラのゲーム開発
ハイブリッド時代のID基盤構成の基礎
20191115-PGconf.Japan
An Insider’s Guide to Maximizing Spark SQL Performance
Data Stream Processing with Apache Flink
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
NDC 11 자이언트 서버의 비밀
Redmineとgitの 連携利用事例
Ad

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

PDF
Mysql HandleSocket技术在SNS Feed存储中的应用
PDF
Scaling Offline Database Usage On GCP @ Dcard
PDF
Nosql及其主要产品简介
PDF
老司機帶你上手 PostgreSQL 關聯式資料庫系統
PDF
RESTful API Design
PDF
Douban qcon2009 beijing
PDF
优酷 Web网站架构案例分析
PDF
Youku arch qcon2009_beijing
PDF
Key value store
PPTX
Nosql三步曲
PDF
美丽说的架构发展与变迁 New
PPTX
Mongo db 特性
PPTX
MOPCON 2012 - 網路服務從 K 到 M
PDF
如何在有限資源下實現十年的後端服務演進
PDF
Introduction to CodeIgniter
PPT
Bluemix Node-Red Part I
PPTX
Another Introduce to Redis
PDF
Qcon 2011:Beansdb 的设计与实现
PDF
MySQL 網路參考架構
PDF
Res tful api design tw-2.0
Mysql HandleSocket技术在SNS Feed存储中的应用
Scaling Offline Database Usage On GCP @ Dcard
Nosql及其主要产品简介
老司機帶你上手 PostgreSQL 關聯式資料庫系統
RESTful API Design
Douban qcon2009 beijing
优酷 Web网站架构案例分析
Youku arch qcon2009_beijing
Key value store
Nosql三步曲
美丽说的架构发展与变迁 New
Mongo db 特性
MOPCON 2012 - 網路服務從 K 到 M
如何在有限資源下實現十年的後端服務演進
Introduction to CodeIgniter
Bluemix Node-Red Part I
Another Introduce to Redis
Qcon 2011:Beansdb 的设计与实现
MySQL 網路參考架構
Res tful api design tw-2.0
Ad

More from Mu Chun Wang (20)

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

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