正文前先来一波福利推荐:

福利一:

百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。

福利二:

毕业答辩以及工作上各种答辩,平时积累了不少精品PPT,现在共享给大家,大大小小加起来有几千套,总有适合你的一款,很多是网上是下载不到。

获取方式:

微信关注 精品3分钟 ,id为 jingpin3mins,关注后回复   百万年薪架构师 ,精品收藏PPT  获取云盘链接,谢谢大家支持!

------------------------正文开始---------------------------

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  ;

pid        /home/xxxx/nginx.pid;

events {
use epoll;
worker_connections ;
multi_accept on;
} http {
lua_package_path "/home/xxxxxx/lib/?.lua;;";
include mime.types;
default_type application/octet-stream;
#access_log off;
keepalive_requests ;
keepalive_timeout 300s 300s;
server_names_hash_bucket_size ;
client_header_buffer_size 32k;
large_client_header_buffers 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 ;
#数据上报
# 默认读取 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 = },
{ host = "yyy", port = },
{ host = "zzz", port = }
}
-- 定义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以上的网卡流量。

openresty+lua+kafka方案与Tomcat接口并发度对比分析的更多相关文章

  1. Openresty+Lua+Kafka实现日志实时采集

    简介 在很多数据采集场景下,Flume作为一个高性能采集日志的工具,相信大家都知道它.许多人想起Flume这个组件能联想到的大多数都是Flume跟Kafka相结合进行日志的采集,这种方案有很多他的优点 ...

  2. OpenResty + Lua + Kafka 实现日志收集系统以及部署过程中遇到的坑

    ********************* 部署过程 ************************** 一:场景描述 对于线上大流量服务或者需要上报日志的nginx服务,每天会产生大量的日志,这些 ...

  3. OpenResty + Lua访问Redis,实现高并发访问时的毫秒级响应打回

    一.lua中redis的配置依赖: 1.OpenResty的lua访问redis的插件:https://github.com/openresty/lua-resty-redis 二.下载后,导入对应的 ...

  4. openresty + lua 4、openresty kafka

    kafka 官网: https://kafka.apache.org/quickstart zookeeper 官网:https://zookeeper.apache.org/ kafka 运行需要 ...

  5. openresty+lua在反向代理服务中的玩法

    openresty+lua在反向代理服务中的玩法 phith0n · 2015/06/02 10:35 0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了 ...

  6. Openresty Lua协程调度机制

    写在前面 OpenResty(后面简称:OR)是一个基于Nginx和Lua的高性能Web平台,它内部集成大量的Lua API以及第三方模块,可以利用它快速搭建支持高并发.极具动态性和扩展性的Web应用 ...

  7. tomcat高并发配置

    最近在项目中负责Tomcat高并发优化方案写一写新得. 优化1)tomcat默认的并发是75,可以启用线程池根据生产环境硬件设定线程池大小. <Executor name="tomca ...

  8. OpenResty Lua钩子调用完整流程

    前面一篇文章介绍了Openresty Lua协程调度机制,主要关心的是核心调度函数run_thread()内部发生的事情,而对于外部的事情我们并没有涉及.本篇作为其姊妹篇,准备补上剩余的部分.本篇将通 ...

  9. tengine lua 开源一 调用内部接口高效发送文件

    tengine  lua 开源一 调用内部接口高效发送文件 开源自己封装的sendfile 模块,可以高效的通过lua发送文件 源码地址:https://github.com/weinyzhou/Lu ...

随机推荐

  1. nginx大概工作机制

    1.master和worker nginx启动后,会有2种进程:worker和master;worker可能有多个:

  2. 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)

    背景: 开发中经常遇到取值属性的时候,需要校验数值的有效性. 例如: 获取props对象里面的friends属性 props.user && props.user.friends &a ...

  3. learning rewind func

    函数名: rewind() 功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头 注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动.而 ...

  4. Teamviewer14重置试用期版

    网上的破解版基本上全部被封禁了,只能通过修改ID来无限试用这个方法了 有些个人使用频繁的用户,经常提示商业环境 此teamviewer14重置试用期,可以一直使用 有条件的还是建议购买付费版. 到期点 ...

  5. Django基础之request对象

    当一个页面被请求时,django就会创建一个包含本次请求原信息的HttpRequest对象. django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用request参数承接这个对象 ...

  6. 2017 ZSTU寒假排位赛 #8

    题目链接:https://vjudge.net/contest/149845#overview. A题,水题. B题,给出 p个 第一个人的区间 和 q个第二个人的区间,问[l,r]中有多少个整数满足 ...

  7. CSS3-弹性盒布局(Flex Box)

    弹性盒布局(Flex Box) 一.概念 弹性盒子是 CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型 ...

  8. java随机生成6位随机数 5位随机数 4位随机数

    随机数,应用会相当广,验证数,订单号,流水号拼接. 下面是java随机数生成语句: 生成6位随机数(不会是5位或者7位,仅只有6位): System.+)*)); 同理,生成5位随机数: System ...

  9. requests_html使用asyncio

    import asyncio import functools from concurrent.futures.thread import ThreadPoolExecutor from reques ...

  10. 转载:在Excel中将数据库字段转换成驼峰式

    转载地址 在Excel中将数据库字段转换成驼峰式 1.将数据库字段复制到Excel表格第一列: 2.在第二列顶部输入=PROPER(A1)命令: 3.在第三列顶部输入=SUBSTITUTE(B1,&q ...