Redis Kafka非同步提高併發

2021-10-07 20:58:53 字數 2063 閱讀 1585

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,然後設定快取並返回值,如果找到了,直接返回查詢到的值即可。閉包正好可以做到這一點,因為它不會釋放外部的引用,從而函式內部的值...