2015/7/13

Scalable Web Architecture

在網頁服務的運算環境中,通常得面對 scalable 的問題,其實在 J2EE 的標準裡,一開始就已經考慮到這個問題,架構上都是切割為三層:Web Layer,Application Layer(Business Logic) 跟 Backend Service Layer(DB 或其他系統)。然而複雜的 EJB container 與通訊問題,造成了這個技術式微,所有人的目光都轉向 light-weight,但在輕量化之後,我們還是得面對大量使用者同時使用的服務架構,技術人員總是得一直追求著,以越少的系統資源提供越多的使用者使用的技術架構。

Concurrent Programming for Scalable Web Architectures 是作者 Benjamin Erb 的畢業研究報告,目標是要找到一個適當的 concurrency model 能用在 multi-core processor,分散式 backend 環境,且能支援新的 web 技術。

在前言中,作者提到網頁將會取代更多桌面的應用程式。接下來十年內,將會專注在 multi-core 與 multiprocessor 的運算環境,而不會增加 CPU 的工作時脈。我們需要選擇適當的程式語言,並搭配合適的 framework,用以設計能夠支援更大規模的 concurrent user 的系統。

討論concurrency有三項重點,接下來的文章內容,會以這三個部份,討論增加系統使用者的策略。

  1. connection handling
    chap4:web server architectures for high concurrency
  2. application logic
    chap5:concurrency concepts for applications and business logic
  3. backend persistence
    chap6: concurrent and scalable storage backends

concurrency 與 scalability

Concurrency 就是系統可同時執行多個活動的一種特性。每個活動都是獨立的,可以發生在不同的運算環境中,例如 single-core processors, multi-core processors, multi-processors 或是分散式系統的多台機器。為保證系統的 consistency,必須有 coordination 與 synchronization 的機制。

有三個方法可改善 concurrency 的效能:

  1. reduce latency
    將工作切割可同時執行的子任務
  2. hide latency
    因為等待 network 或 disk IO 會造成延遲,可同時執行多個外部系統的工作。
  3. increase throughput
    藉由同時執行多個 task 可增加系統 throughput,也可增加 sequential task 的執行速度。

Concurrency vs. Parallelism

簡單地說,paralleism 是由硬體架構支援的平行處理,這是執行的狀態,可用 multi-core 或是 multiprocessor 實現,而 concurrency 是程式語言支援的模式。single core 的機器也可以支援 concurrency 但不能支援真正的 paralleism。

Models for Programming Concurrency

有四種 programming concurrency

  1. sequential
    沒有 concurrency
  2. declarative
    implicit control flow of computation
  3. message-passing
    activities 透過傳遞 message 互動,訊息傳遞有 synchonous 與 asynchronous 兩種。
  4. shared-state
    可競爭存取資源與狀態

Horizontal and Vertical Scalability

通常是採用 horizontal scalability,就是用很多低成本的機器進行水平擴充。然而採用 vertical scalability 的考量點,就是使用更好的機器,更快的 CPU,在於成本效益、或是專用的硬體,application 也不需要特別進行客製化。

scalability requirements

  1. high availability
    通常用 percentiles of uptime 來計量
  2. reliability
    以 meantime between failures 計算
  3. performance
    short response times (low latencies)

Scalable Web Architecture

tiers architecture

通常 web architecture 可分為三個不同的 tiers

  1. presentation tier
    html user interface
  2. application logic tier
    business logic
  3. persistence tier
    database

load balancing strategies

  1. round robin
  2. least connections
    以連線數量決定
  3. least response time
    以最小的 response time 決定
  4. randomized
  5. resource-aware
    搭配 connection 數量與 response time 計算出適當的 loading 分配比率

sticky session

雖然 http 是 stateless,但 web application 常常需要讓 user 在同一個 session 中,存取同一個 web server,這時候可透過 cookie 來決定分配的機器。

在 scalable web architecture 中,我們不應該試著將 user 導向到同一台機器,而是要找到一個方法,讓後端的多個機器,可以同時取得使用者的 session data。

Web Server Architecture for High Concurrency

目標是更多的 concurrent http requests,server 的 performance 可用以下的 metrics

  1. request throughput (#/sec)
  2. raw data throughput (Mbps)
  3. response time (ms)
  4. number of concurrent connections (#)

在機器上可取得的 metrics

  1. CPU utilication
  2. memory usage
  3. number of open socket/file handles
  4. number of threads/processes

C10K

理論上, 500 MHz, 1 GB of RAM, 6 x 100Mbit/s 的硬體,同時有 10000 個客戶連線完全是可行的,目前已經有公司提出 C500K 的 concurrent model。

I/O Operation Models

  • blocking vs. non-blocking
    application 可告訴 OS 該如何存取 device。
    blocking mode 的 IO operation 會一直等待,等到該 operation 完成才會 return。non-blocking mode 中,所有 operation 都會立刻 return,並提供 call status 或是 error。

  • synchronous vs. asynchronous
    說明在 IO Operation 過程中的 control flow,synchronous call 會一直等待 operation 的結果,而 asynchronous call 會立刻 return,然後可繼續執行其他 operations。

Server Architecture

  • Thread-based
  1. multi-process architecture
    傳統的 unix-based network server 就是每一個 connection 產生一個 process

  2. multi-threaded architecture
    在一個 process 裡面,多個 thread 共用相同的 memory,共用 global variables 與 state,建立 thread 比建立 process 消耗的系統資源少。

    系統可用一個 thread 接受 request,然後 dipatch 到 worker thread pool 中,取得一個有空閒的 worker thread 處理該 request。

  • Event-driven
    利用一個 thread 執行 event loop,每一次處理一個從 event queue 取得的 event。

對於大規模的 concurrent connection,目前比較流行的作法是使用 asynchronous/non-blocking I/O operations 的 event-driven server architectures。

Concurrency Concepts for Applications and Business Logic

將 application logic 區分為兩種類型

  1. CPU-bound activities
    需要 CPU 在記憶體進行大量的計算,通常在 web application 中,input validation, template rendering, on-the-fly encoding/decoding 就屬於這類型的 task

  2. I/O-bound activities
    受 network or file I/O 限制的 activities,包含了 storage backend, background services, external services

concurrency based on thread, locks, and shared state

thred 控制了 application flow,當兩個以上的 thread 同時 access ctritical 資料時,需要一個locking mechanism,來控制 threads 之間的狀態變化。

Java 語言就是使用這種機制

concurrency via software transactional memory (STM)

由 programming language 直接提供 locking 與 shared state 機制。

Clojure 使用這個機制

Actor-based Concurrency

利用 actors 進行 concurrent processing,actor 可透過以下方式取得需要進行處理的 message

  1. Send a finite number of messages to other actors.
  2. Spawn a finite number of new actors.
  3. Change its own internal behavior, taking effect when the next incoming message is handled.

scala 使用這個機制,actor 的實作有兩種方式

  • Thread-based Actors
    使用 receive

  • Event-driven Actors
    使用 react

Event-driven Concurrency

node.js 使用這個機制

Concurrent and Scalable Storage Backends

CAP Theorem

一個分散式系統不可能同時滿足以下三點,最多只能滿足其中兩項,例如 CA: high-availability consistency, CP: enforced consistency, AP: eventual consistency

  • consistency 一致性
  • availability 可用性
  • partition tolerance 容忍網絡分區

Consistency Models

  • ACID: 具有 transaction 的行為
    atomicity: 交易細項,是全有或是全無
    consistency: 執行交易時,保證從一個狀態過渡到另一個狀態
    isolation: 保證 transaction 不受其他交易影響
    durability: 一旦 transaction 成立,交易的結果一定會保存,即使系統 crash 也是一樣

  • BASE: 簡單而快速,盡力而為
    basically available
    soft state: 客戶端要接受,某些狀況下會失效
    eventually consistent: 盡可能地提供一致性

Replication strategies

  • Master-Slave
    單一 Master node 提供寫入,多個nodes 以 load balancer 提供讀取的功能

  • Multi-Master
    允許多個 node 同時讀寫

Distributed DB System 的類型

  • Relational DBMS

  • Non-Relational DBMS

  1. Key/Value Stores
    ex: Dynamo from Amazon, Redis
  2. Document Stores
    ex: CouchDB
  3. Wide Column Stores
    ex: BigTable, Cassandra
  4. Graph Database
    ex: neo4j