openresty+lua+kafka方案與Tomcat接口並發度對比分析


1、openresty+lua+kafka

1.1 openresty+lua+kafka方案

  之前的項目基於nginx反向代理后轉發到Tomcat的API接口進行業務處理,然后將json數據打入kafka中,但是隨着業務的擴大,訪問量越來越大,並發數也很高,導致程序遇到性能問題;

基於nginx的高性能特點,現在考慮使用一種openresty+lua+kafka,直接在nginx階段將數據打入kafka中,來提高性能。

1.1.1 OpenResty運行原理

  Nginx 采用的是 master-worker 模型,一個 master 進程管理多個 worker 進程,基本的事件處理都是放在 woker 中,master 負責一些全局初始化,以及對 worker 的管理。在OpenResty中,每個 woker 使用一個 LuaVM,當請求被分配到 woker 時,將在這個 LuaVM 里創建一個 coroutine(協程)。協程之間數據隔離,每個協程具有獨立的全局變量_G。

  協程和多線程下的線程類似:有自己的堆棧,自己的局部變量,有自己的指令指針,但是和其他協程程序共享全局變量等信息。線程和協程的主要不同在於:多處理器的情況下,概念上來說多線程是同時運行多個線程,而協程是通過代碼來完成協程的切換,任何時刻只有一個協程程序在運行。並且這個在運行的協程只有明確被要求掛起時才會被掛起。

原理圖如下:

 

1.1.2 OpenResty的優勢

  其是由Nginx核心加很多第三方模塊組成,其最大的亮點是默認集成了Lua開發環境,使得Nginx可以作為一個Web Server使用。

借助於Nginx的事件驅動模型和非阻塞IO,可以實現高性能的Web應用程序。

而且OpenResty提供了大量組件如Mysql、Redis、Memcached等等,使在Nginx上開發Web應用更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua架構,其他公司如淘寶、去哪兒網等。

1.2 方案實施

申請線上雲主機,部署公司內部部署平台NDP;

配置openresty:

worker_processes  8;

pid        /home/xxxx/nginx.pid;


events {
    use epoll;
    worker_connections  65535;
    multi_accept on;
}


http {
    lua_package_path "/home/xxxxxx/lib/?.lua;;";
    include       mime.types;
    default_type  application/octet-stream;
    #access_log off;
    keepalive_requests 8192;
    keepalive_timeout 300s 300s;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 1024m;
    client_body_buffer_size 10m;

    log_format  main  '$remote_addr$time_iso8601$request'
                      '$status$upstream_response_time$request_time'
                      '$http_user_agent$http_x_forwarded_for';

    access_log off;
    # access_log  /home/xxxxxx/access.log  main;

    sendfile on;
    #提高I/O性能
    tcp_nodelay on;
    proxy_buffering off;
    #此請求不緩存
    #add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";
    #add_header Pragma "no-cache";
    #add_header Cache-Control "no-cache, max-age=0, must-revalidate";
    resolver xxxxx;

    # healthcheck shared
    # lua_shared_dict healthcheck 1m;

    # 數據書籍服務匯總
    include ./service_hub/*;

}

 

配置依賴lua依賴:

配置server服務:

server {
        listen 8080;
        #數據上報
        # 默認讀取 body
        lua_need_request_body on;
        location /xxxx {
           # access_log  /home/xxxx/risk_doubt.log  main;
           # 響應正常,內容為空
           empty_gif;
           content_by_lua_block{ 
            -- 引入lua所有api
            local topic = "xxxx"
            local cjson = require "cjson"  
            local producer = require "resty.kafka.producer"  
            -- 定義kafka broker地址,ip需要和kafka的host.name配置一致  
            local broker_list = {  
                { host = "xxx", port = 9092 },
                { host = "yyy", port = 9092 },
                { host = "zzz", port = 9092 }
            }  
            -- 定義json便於日志數據整理收集  
            local data_json = {}  
            ngx.req.read_body()
        local args = ngx.req.get_body_data()
        -- 將ip傳入json參數中
        data_json["body"] = args
        data_json["ip"] = ngx.var.remote_addr
        -- 轉換json為字符串
        -- ngx.log(ngx.ERR, "args:", tostring(data_json))
            local message = cjson.encode(data_json);  
            ngx.log(ngx.ERR, "args:", message)
        -- 定義kafka異步生產者  
            local bp = producer:new(broker_list, { producer_type = "async" })  
            -- 發送日志消息,send第二個參數key,用於kafka路由控制:  
            -- key為nill(空)時,一段時間向同一partition寫入數據  
            -- 指定key,按照key的hash寫入到對應的partition  
            -- local ok, err = bp:send(topic, nil, message)  

            -- if not ok then  
            --     ngx.log(ngx.ERR, "kafka send err:", err)  
            --     return  
            -- end  
       }
        }
       
        
}

 

1.3 壓力測試:

線上被測雲主機性能:8核,16G內存,400M網卡流量。

  該次測試是在 1000並發量,1分鍾16秒壓測時間段內的數據:

 

二、Tomcat接口的測試:

    @PostMapping(value = "/xxxx")
    public Object test(String str, HttpServletRequest request) throws IOException
    {
        //logger.info("receive msg...");
        return null;
    }

同上的壓測環境進行壓測:

 

 三、性能分析:

1、同樣的壓測環境,openresty的TPS性能確實要比單純的Tomcat要好;

2、根據TPS的性能曲線可以看到,openresty的TPS曲線要比tomcat的更加穩定;

 

中間遇到的問題分析:

其實參考資料你會發現,測試結果中openresty的TPS數值比起網上很多數值要低不少,有不少網友的壓測結果是10W+,為什么有這么大的差距呢,主要原因還是樓主所使用的線上雲主機網卡流量有限制,只有400M,

導致了openresty的性能無法得到充分的發揮,后期項目中會考慮換用1G以上的網卡流量。


免責聲明!

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



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