Redis+Kafka異步提高並發
- Redis+Kafka異步提高並發
- 設計
- 實現
- 提交請求接口
- Kafka消費隊列
- 異步處理Service
- 客戶端輪詢獲取結果
- Redis集群節點配置
- KafKa集群節點配置
- 壓力測試
Redis+Kafka異步提高並發
我們平時開發的后台接口,如果不優化,比如加緩存,異步等,接口並發量很難上得來,因為業務邏輯處理需要時間,后面的請求都在排隊,時間一長就都超時了,這就是壓力測試經常遇到的問題。簡單說就是並發量上不來,那如何提高並發呢。
設計
提高並發通常有幾個步驟,而且是循序漸進的。通常我是按如下幾個點來優化並逐步測試。
1.優化我們的基本代碼
如循環體內多次與數據庫交互,涉及查詢和修改,這種肯定需要先優化掉,基本原則就是,盡量減少循環體內與數據庫交互的次數
2.加緩存,一般如Memcache, Redis
加緩存的目的也是盡量減少與數據庫交互的次數
3.異步處理
使用消息隊列MQ,將接收到的請求放入隊列,然后馬上返回給客戶端,再由異步線程來處理隊列。
基於以上的優化思路,不想提升並發量都難啊。
實現
這里重點介紹下redis+kafka實現異步
提交請求接口
Controller將客戶端請求參數放入KafKa隊列,參數校驗在Controller層完成。並清理redis緩存,標記Redis隊列處理未完成,然后返回給客戶端。
客戶端收到反饋,但並沒有獲取到結果數據,這時可以嘗試輪詢獲取結果,因為后台結果正在異步處理中
Kafka消費隊列
KafKa消費者線程,消費到指定的topic,獲取我們放入隊列的請求參數,開始調用Service異步處理
異步處理Service
需要注意:異步處理的耗時問題,如果處理時間太長,隊列消費會出現堆積現象,要想辦法提高隊列處理速度,才能從根本上提高並發。
提高隊列的處理速度,無外乎上面提到的基本代碼優化和緩存
客戶端輪詢獲取結果
提交請求后,因為后台立即返回接收數據成功,所以前端需要間隔輪詢獲取打卡結果,比如1秒請求一次循環10次還拿不到結果,說明后台隊列處理失敗了
Redis集群節點配置
redis:
cluster:
max-redirects:
# 集群節點
nodes: xxx.xxx.xxx.xx1:6378, xxx.xxx.xxx.xx1: 6379, xxx.xxx.xxx.xx2: 6378, xxx.xxx.xxx.xx2: 6379, xxx.xxx.xxx.xx3: 6378, xxx.xxx.xxx.xx3: 6379
# 密碼
password: xxxxxx
# ssl
ssl: false
jedis:
pool:
max-active: -1
max-idle: 8
max-wait: -1
min-idle: 0
timeout: 10000
KafKa集群節點配置
kafka:
bootstrap-servers: xxx.xxx.xxx.xxx:9092, xxx.xxx.xxx.xxx:9092, xxx.xxx.xxx.xxx:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: check-consumer-group-prd
enable-auto-commit: false
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
concurrency: 6
我們生產服務器都是雙節點,這里Kafka消費者單個節點配置的是6個消費者,總共是12個消費者線程同時消費隊列
壓力測試
壓力測試使用Jemter
作者介紹:小林,狐小E資深開發工程師,專注移動協同辦公平台的SAAS軟件開發以及輕應用開發
最近開發了一款移動辦公軟件狐小E