kafka集群節點配置
壓力測試
我們平時開發的後台介面,如果不優化,比如加快取,非同步等,介面併發量很難上得來,因為業務邏輯處理需要時間,後面的請求都在排隊,時間一長就都超時了,這就是壓力測試經常遇到的問題。簡單說就是併發量上不來,那如何提高併發呢。
提高併發通常有幾個步驟,而且是循序漸進的。通常我是按如下幾個點來優化並逐步測試。
1.優化我們的基本**
如迴圈體內多次與資料庫互動,涉及查詢和修改,這種肯定需要先優化掉,基本原則就是,儘量減少迴圈體內與資料庫互動的次數
2.加快取,一般如memcache, redis
加快取的目的也是儘量減少與資料庫互動的次數
3.非同步處理
使用訊息佇列mq,將接收到的請求放入佇列,然後馬上返回給客戶端,再由非同步執行緒來處理佇列。
基於以上的優化思路,不想提公升併發量都難啊。
這裡重點介紹下redis+kafka實現非同步
controller將客戶端請求引數放入kafka佇列,引數校驗在controller層完成。並清理redis快取,標記redis佇列處理未完成,然後返回給客戶端。
客戶端收到反饋,但並沒有獲取到結果資料,這時可以嘗試輪詢獲取結果,因為後台結果正在非同步處理中
kafka消費者執行緒,消費到指定的topic,獲取我們放入佇列的請求引數,開始呼叫service非同步處理
需要注意:非同步處理的耗時問題,如果處理時間太長,佇列消費會出現堆積現象,要想辦法提高佇列處理速度,才能從根本上提高併發。
提高佇列的處理速度,無外乎上面提到的基本**優化和快取
提交請求後,因為後台立即返回接收資料成功,所以前端需要間隔輪詢獲取打卡結果,比如1秒請求一次迴圈10次還拿不到結果,說明後台佇列處理失敗了
redis:
cluster:
max-redirects:
# 集群節點
nodes: ***.***.***.xx1:6378, ***.***.***.xx1: 6379, ***.***.***.xx2: 6378, ***.***.***.xx2: 6379, ***.***.***.xx3: 6378, ***.***.***.xx3: 6379
# 密碼
password: ******
# ssl
ssl: false
jedis:
pool:
max-active: -1
max-idle: 8
max-wait: -1
min-idle: 0
timeout: 10000
kafka:
bootstrap-servers: ***.***.***.***:9092, ***.***.***.***:9092, ***.***.***.***: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
python logging日誌記錄並非同步傳送
實現思路 新建乙個佇列,將logging的http 傳送任務放入佇列中。啟動乙個執行緒監控佇列情況,並從佇列依次取任務傳送。從而將日誌記錄和日誌傳送分離開,日誌傳送與業務功能 解耦,提高執行速率。import pytz import logging from logging.handlers imp...
讓Redis 非同步 即時返回資料並非同步更新資料
設定stale時段,在此期間的get請求即時返回資料之後,通過非同步任務更新資料 這裡用了 tornado.ioloop 任意語言的的非同步機制當然沒有問題 pythonfrom tornado.ioloop import ioloop class stalerediscache rediscach...
JS閉包非同步獲取資料並快取
設想我們需要向介面請求所需資料,又不想儲存在全域性變數中,並且會多次使用,那麼我們就需要將請求的資料儲存起來,當呼叫這個函式的時候,首先在快取中查詢,如果找不到,則呼叫api,然後設定快取並返回值,如果找到了,直接返回查詢到的值即可。閉包正好可以做到這一點,因為它不會釋放外部的引用,從而函式內部的值...