在開始使用 Aerospike 開發應用程式時,掌握其客戶端的連線、資料操作以及策略控制的完整生命週期至關重要。本文將以 Python 客戶端為例,引導您完成從建立連線到執行基本資料讀寫,再到應用進階寫入策略的完整流程,並介紹如何使用 AQL 工具輔助開發與除錯。

第一部分:建立與管理連線

應用程式與 Aerospike 叢集的互動始於建立一個 AerospikeClient 實例。這個客戶端物件是執行緒安全的,並且內部維護著一個高效的連線池。

1. 連線設定

連線時,您需要提供一或多個「種子節點」(Seed Nodes) 的位址。客戶端會先嘗試連接第一個種子節點,一旦成功,便會從該節點獲取整個叢集的節點列表,並與所有節點建立連線。

Python 範例:連線到本地單節點

import aerospike

# 1. 設定連線參數
config = {
    'hosts': [ ('127.0.0.1', 3000) ]
    # 'user': 'your-user',      # 如有設定 ACL,需提供使用者名稱
    # 'password': 'your-password' # 和密碼
}

# 2. 初始化客戶端並建立連線
try:
    client = aerospike.client(config).connect()
    print("成功連接到 Aerospike 叢集。")
    # ... 後續操作 ...
finally:
    # 確保在應用程式結束時關閉連線
    if 'client' in locals() and client.is_connected():
        client.close()
        print("已關閉與 Aerospike 的連線。")

最佳實踐:

  • 在生產環境中,hosts 列表應至少包含 2-3 個叢集節點的位址,以避免單點故障。
  • AerospikeClient 物件的建立是昂貴的操作。對於長時執行的應用程式(如 Web 服務),應該在應用程式啟動時建立一個單一的客戶端實例,並在所有執行緒中重複使用它,而不是為每個請求都建立新的連線。

第二部分:核心資料操作

Aerospike 的所有資料操作都圍繞著 Key (鍵) 和 Bin (資料容器) 這兩個核心概念。

  • Key: 一個三元組 (namespace, set, user_key),唯一地標識一筆記錄 (Record)。
  • Bin: 一個鍵值對,用於儲存記錄中的具體資料,類似於 JSON 中的一個欄位。

Python 範例:寫入與讀取資料

# 1. 定義操作目標 Key
key = ('test', 'demo', 'user123') # Namespace: test, Set: demo, PK: 'user123'

# 2. 準備要寫入的 Bins (以字典形式)
bins = {
    'name': '玄貓',
    'level': 99,
    'interests': ['NoSQL', '系統架構']
}

# 3. 執行寫入 (put) 操作
client.put(key, bins)
print(f"成功寫入資料至鍵: {key}")

# 4. 執行讀取 (get) 操作
(key, metadata, record_bins) = client.get(key)
print(f"成功讀取資料: {record_bins}")
# 輸出: 成功讀取資料: {'name': '玄貓', 'level': 99, 'interests': ['NoSQL', '系統架構']}

圖表解說:應用程式互動流程

此循序圖展示了一個典型的應用程式與 Aerospike 伺服器進行一次完整讀寫操作的互動流程。

@startuml
!theme _none_
skinparam dpi auto
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam minClassWidth 100
skinparam defaultFontSize 16
title Aerospike 應用程式互動流程

participant "Python App" as App
participant "Aerospike Client" as Client
participant "Aerospike Server" as Server

App -> Client : aerospike.client(config).connect()
Client -> Server : 建立連線
Server --> Client : 連線成功

App -> Client : client.put(key, bins)
Client -> Server : 傳送寫入請求
Server --> Client : 回應寫入結果

App -> Client : client.get(key)
Client -> Server : 傳送讀取請求
Server --> Client : 回應 Record
Client --> App : 回傳 Record

App -> Client : client.close()
Client -> Server : 關閉連線

@enduml

第三部分:控制操作行為 (WritePolicy)

預設情況下,put 操作是「更新或插入」(upsert)。我們可以透過傳遞一個 WritePolicy 來改變這個行為。

場景: 建立一個新帳號,如果該帳號已存在,則操作應失敗。

# 設定策略為僅建立 (CREATE_ONLY)
policy = {
    'exists': aerospike.POLICY_EXISTS_CREATE
}

try:
    # 第一次寫入,成功
    client.put(key, bins, policy=policy)
    print("新帳號建立成功。")
    
    # 第二次使用相同 key 寫入,將會失敗
    client.put(key, bins, policy=policy)
except aerospike.exception.RecordExistsError:
    print(f"錯誤:鍵 {key} 已存在,無法重複建立。")

policy 字典還可以控制其他行為,如 total_timeout (總超時時間) 和 max_retries (最大重試次數)。

第四部分:輔助工具 (AQL)

AQL (Aerospike Query Language) 是一個方便的命令列工具,用於快速驗證和操作資料庫中的資料,是開發和除錯過程中的得力助手。

  • 啟動 AQL:
    aql
    
  • 查詢資料:
    aql> SELECT * FROM test.demo WHERE PK = 'user123'
    
  • 插入資料:
    aql> INSERT INTO test.demo (PK, name, level) VALUES ('user456', 'BlackCat', 100)
    

掌握了從連線到操作,再到策略控制的完整流程,您就具備了使用 Aerospike 開發穩健應用程式的基礎能力。