什麼是 Web Session?
想要快速了解 Web Session 是什麼的話,非常推薦這篇文章!簡單來說,要在 Stateless 的網路世界中快速理解 Request 是哪一位使用者的話,就需要用 Session ID ( 給你一個號碼牌 ) 來分辨。而 Session ID 需要時常的存取和更動,若這環節出了問題的話,整個系統都會受到影響 ( HA 高可用的重要性 ),若這環節的效能太差的話,整體 Application 的回應速度就會過慢,所以 Web Session 是非常重要的!
Session Database 有可能遇到什麼問題?
我想針對不同層面去探討:
- Response Time 需要非常快速
- Highly Available ( 高可用 ) 正如同上一段提到的,Session 對於每個使用者來說都很重要,不管是已登入或是未登入使用者。若在這環節出了問題的話,整個系統都會受到影響,所以高可用會是一個非常重要的觀察點!
- Security ( 資料安全性 ) 資料安全很重要,這應該不用提了吧 XD ( 看看最近的 iRent 完全公開的 Database 就知道了 ),所以資料加密和權限管控也是我們需要考量的重點之一!
- Scalability (可擴展性) 當我們的 session 數量增多以後 ( 或是時間越久,session 的數量也會越多),Database 就會需要擴展,不同的 Database 擴展的方法也不同,對於我來說,維運所花費的人力成本越少越好,所以在可擴展的同時我也會考慮 Serverless 所帶來的效益。
- 需要可以簡易的更改資料 Schema 我們有可能會對不同類型的使用者存取不同類型的資料,因此 NoSQL Database 會是一個很好的選擇~
此外,是我個人的考量,我希望維運的成本可以盡量減少,所以 Serverless Database 會是我考量的一大重點!
可以作為 Session Database 的資料庫有哪些?
MySQL
通常會將 Session Data 存在一張 session table 中 ( 以 Django 舉例的話預設則是 django_session 這張表 )。為了讓 Production 環境的 scalability and high availability 會建立 Database Cluster,也會加入 Multi-AZ Standby 的祭器以確保 Failover 以及系統更新時不會有 downtime。
但上述種種都會增加大量的費用 $_$ 以及維運成本。此外,Django default 的 Session 雖然表中有設定 expire_date
,但是 Django 是被動檢查的,也就代表表中過期的資料是不會刪除的。需要刪除 expire data 就需要我們手動刪除 ( 或是寫一個 cronjob 去處理過期資料 ),也增加了我們維運的成本。
另外,MySQL 的 schema 是固定的,下方畫面中間的 session_data
Redis
In-memory database,速度極快。
非固定 Schema,很適合 Session 資料。擁有 Time to Live (ttl) 的設定,可以讓資料自動過期!非常的好用!缺點是一樣需要管理 Server 和 cluster 架立起來一樣很貴,若服務有高低鋒時刻的話需要 scale down 才不會浪費資源。
DynamoDB
Amazon DynamoDB is a fully managed, serverless, key-value NoSQL database designed to run high-performance applications at any scale. — AWS DynamoDB
官網上的第一句話就解釋了,我們不需要花費任何的維運成本就可以享受高可用的 DynamoDB!可以自動擴展、Serverless、計費方法一樣是用多少算多少!
因為是 NoSQL Database,所以我們可以針對不同的使用者存入不同的 schema 的資料,非常適合儲存 Session!
此外,支援 Amazon DynamoDB Time to Live (TTL),這可以讓我們定義一個 Attribute 存放 timestamp,當時間到達此 timestamp 的時間時,自動刪除 ( 雖然官網表示不會馬上刪除,但還是有處理方法,接著介紹到的套件會處理這件事 )。TTL 也可以各自設定不同的時間,極高度的自由! 很重要的一點是,因為 DynamoDB 有獨特的 Single Table Design 概念,若是我們在 Table 中有不想要自動過期刪除的資料,那我們只要不設定該 TTL 的 attribute 就可以了!
安全性方面,我們可以用 AWS IAM & AWS KMS 分別去管控權限和資料加密,對我來說 AWS DynamoDB 是非常非常適合拿來做 Session Database 的!
如果讓 Django 使用 DynamoDB Session Backend 呢?
Django-Dysession 是一項非常容易導入的套件,這個套件可以讓 Django 開發者只用短短兩行程式碼就將 Session Backend 替換 成使用 AWS DynamoDB!
1INSTALLED_APPS = [
2 ...
3 "dysession", # add dysession to installed apps
4 # 'django.contrib.sessions', # remove this default session
5 ...
6]
7
8SESSION_ENGINE = "dysession.backends.db"
除了上述兩行以外,其他的使用方法就跟原本的使用方法一模一樣! 超級方便使用!
1from django.http import HttpResponse
2
3def mainpage(request):
4 request.session["is_admin"] = True
5 request.session["bottle_of_milks"] = 20
6 request.session["planet_have_been_to"] = ["Earth", "Jupiter", "Saturn"]
7
8 return HttpResponse("Ayyy")