Redis+Kafka異步提高並發


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM