Comments (9)
hi
测试过程中发现几个问题:
- 如果处理过程等待结果时,其他的都会被阻住。
- 如果访问url 导致错误,后续都不再正常了。
- 模板读取采用读写打开,只读系统无法工作。
- post 的url 参数没有解析。
- lua 编译不完全。popen 无法使用。
感谢您的热心反馈! 由于回复不及时, 我感到十分抱歉. 下面回复您的问题:
目前我只复现了您提出的Q3
问题, 这也是因为aoi
库默认用的rw
方式打开的原因.(如果要改的话, 只能使用io
库)
您这边方便详细描述下问题,给出些许测试用例
么?
from cfadmin.
Q4
的问题是因为POST
方法请求我并不会解析url query
的值将其放在args
参数内.
这是因为已经在httpd.Form
库内提供了get_args
方法来解析path, 你只需要将url传递进去即可.
from cfadmin.
hi
Q1. 测试性能时发现。因为没有多进程,也没有线程池分发;所以测试其如果一个任务耗时,是否导致其他的访问。
写个简单的用例,sleep;然后再发起新访问。后续的都被阻住。
Q2. 只要出现 response must be a string and not empty." 就 不再正常工作了。场景就是 对一次操作返回 空或无效。
Q3. cf框架,一般不会改其代码,因为安全性尤其库代码,安装到系统中权限只读。使用过程带来两个问题,(1.只读系统不能正常,2,静态文件路径只能一个,自定义的必须放倒static 目录下。),当然使用其他手段都可以做到。
Q4. close
Q5. 编译问题,将编译posix改成 linux, 加-DLUA_USE_LINUX就可以解决,其他系统没测试。
from cfadmin.
hi
Q1. 测试性能时发现。因为没有多进程,也没有线程池分发;所以测试其如果一个任务耗时,是否导致其他的访问。
写个简单的用例,sleep;然后再发起新访问。后续的都被阻住。
Q2. 只要出现 response must be a string and not empty." 就 不再正常工作了。场景就是 对一次操作返回 空或无效。
Q3. cf框架,一般不会改其代码,因为安全性尤其库代码,安装到系统中权限只读。使用过程带来两个问题,(1.只读系统不能正常,2,静态文件路径只能一个,自定义的必须放倒static 目录下。),当然使用其他手段都可以做到。
Q4. close
Q5. 编译问题,将编译posix改成 linux, 加-DLUA_USE_LINUX就可以解决,其他系统没测试。
问题我已经收到, 这边回答一下您的反馈:
app:api('/api/test', function (content)
print("Hello Api.")
end)
app:api('/api/sleep', function (content)
require"cf".sleep(5)
end)
我们定义的2个接口
他们都会在返回的时候打印警告信息, 警告信息是为了辅助开发者纠正编码逻辑而存在的.
其次, 我也并未复现你所述的返回错误后无法工作(有可能是我的测试用例与你表达的意思不对); 因为他们并不会触发异常
逻辑.
它们的结果返回如下:
[root@iZbp12lbijgeyzrtr7dzahZ core_framework]# $ ./cfadmin.exe
[2020/09/11 10:54:05] [INFO] httpd listen: 0.0.0.0:9999
[2020/09/11 10:54:05] [INFO] httpd Web Server Running...
Hello Api.
[2020-09-11 10:54:11,921] [@lualib/protocol/http/init.lua:528] [ERROR] : "Response Error [/api/test]: response must be a string and not empty."
[2020/09/11 10:54:11] - ::1 - ::1 - /api/test - GET - 500 - req_time: 0.000589/Sec
Hello Api.
[2020-09-11 10:54:13,266] [@lualib/protocol/http/init.lua:528] [ERROR] : "Response Error [/api/test]: response must be a string and not empty."
[2020/09/11 10:54:13] - ::1 - ::1 - /api/test - GET - 500 - req_time: 0.000162/Sec
[2020-09-11 10:54:14,822] [@lualib/protocol/http/init.lua:528] [ERROR] : "Response Error [/api/sleep]: response must be a string and not empty."
[2020/09/11 10:54:14] - ::1 - ::1 - /api/sleep - GET - 500 - req_time: 5.000846/Sec
你可以结合日志输出时间
与请求耗时
推算出/api/sleep
在/api/test
之前被调用, 并且在任何接口出错了也不会影响到其它请求.
至于您对性能测试
的描述, 框架会在调用sleep
的同时让出执行权限给其它请求响应. 除非你使用while 1 do end
编写在回调内, 否则任何I/O
阻塞只会影响到当前请求.
-
我收到
Q3
后review
了之前的实现, 对于一些权限控制严谨
的环境来说确实会影响到部署; 我非常认同你的观点, 权限范围控制是在项目中必不可少的. 我近期会解决这个问题. -
Q4
我使用的是build.sh
脚本安装依赖, 但还是不存在popen
无法使用的情况; 还有一种可能是我们使用的版本、环境、编译方式不一致导致的. 这里给出一个测试的代码与结果, 我们可以比较一下是否一致:
-- Linux/MAC OSX/FreeBSD使用ls, Windows使用dir
local sys = require "sys"
local cmd = sys.os() == 'Windows' and "dir" or "ls"
local f, err = io.popen(cmd, "r")
if not f then
return print("错误:" .. err)
end
print("成功:")
print(f:read "*a")
Windows
环境下的输出结果:
C:\msys64\home\Candy\core_framework> cfadmin.exe
成功:
3rd build.sh doc lualib src views
CMakeLists.txt cfadmin.exe docker msys-core.dll static
LICENSE cfadmin.pid logs run.sh stop.sh
Makefile clean.sh luaclib script update_doc.sh
C:\msys64\home\Candy\stt_trade>
Linux
环境下的输出结果:
[root@iZbp12lbijgeyzrtr7dzahZ core_framework]# ./cfadmin -e script/demo.lua
成功:
3rd
app.pid
build.sh
cfadmin
cfadmin.pid
clean.sh
CMakeLists.txt
doc
docker
libcore.so
libeio.a
libeio.so
libeio.so.1
libeio.so.1.0.0
libev.a
libev.so
libev.so.4
libev.so.4.0.0
liblua.a
LICENSE
logs
luaclib
lualib
Makefile
run.sh
script
src
static
stop.sh
update_doc.sh
views
woker.pid
[root@iZbp12lbijgeyzrtr7dzahZ demo]#
from cfadmin.
hi
非常抱歉可能问题有的地方描述不清楚。再补充一下
Q1.测试目的是,如果处理被阻塞了,是否影响后续的处理。用sleep只是模拟处理没有退出,cf.sleep,这是人为的让出线程,达不到测试目的。nginx 只开启一个进程也存在这个问题,所以多进程解决。cf目前没有考虑这个情况。
Q2.cfadmin group add 增加的路由,不返回,出错后,就不再正常; 刷新重新登录也还可以。应该与会话管理有关
Q5.在ubutun 16 ,18 下编译出现,后来再arm下交叉编译也同样存在这个问题,popen not support。 修改编译宏,解决。 我的系统都是纯净的,没有事先安装lua 等;最终通过编译可以解决。
from cfadmin.
Q1的问题提到了不考虑非I/O
造成阻塞情况下的问题; 其实早在设计之初大家都会假设开发者不会主动在框架里编写这样的业务.
这种情况下, 无论是Nginx
还是其他框架在阻塞了所有线程或进程之后. 最多能做的也就是打出日志提示而已. 这并没有什么用.
后来我们认为, 某些特殊的业务始终会存在耗时操作. 那么耗时任务就应该由消息队列来统一完成任务分发
与异步确认
. 这里举例:
我们可能会编写这样的代码来发布或查询异步任务:
local mq = get_mq_app()
local db = get_db_app()
app:api("/api/task/add", function(content)
mq:emit("/queue/1 - 100", { uid = uid, queue_info = queue_info })
end)
app:api("/api/task/get", function(content)
return db:get_task_result()
end)
接下来, 我们可能会有N个实例(1 - 100)来完成我们的耗时操作(具体使用可以参考MQ
使用指南):
local mq = get_mq_app()
-- MQ 订阅者 {1 - 100}
mq:on("/queue/" .. {1 - 100}, function(msg)
-- DO SOMETHING FOR YOUR MSG
end)
mq:start()
这样, 可以假设我们使用足够多的App实例来完成你所说的耗时操作. 也就不会存在阻塞
的问题了.
from cfadmin.
Q2
与Q5
我可能还需要进一步测试.
或者你看下这边能给出你正在使用的cf
版本, 我根据这个版本再跟进下系统编译的更新.
:)
from cfadmin.
hi
我是用 上个礼拜一的主干版本。
from cfadmin.
我不知道选择的版本是否正确, 所以我选了4个Ubuntu的版本: 18 Desktop/Server, 16 Desktop/Server.
这两天我在虚拟机上与云服务器上测试了一下, 你说的Linux发行版都没出现popen
的问题.
是否使用的Linux是自行编译或下载源、版本有差异呢? 我这边用的build.sh
应该不会出现没包含popen
的问题.
from cfadmin.
Related Issues (20)
- sudo docker-compose -f docker-compose-with-cfadmin.yaml up 运行失败 HOT 4
- ubuntu build error HOT 4
- 自己编译和docker都不能正常运行 HOT 10
- 安全机制控制问题 HOT 2
- 文件上传只能小文件 HOT 15
- 域名访问 出现问题 HOT 19
- firefox 认证不正确 HOT 3
- 浏览器适配问题 HOT 5
- 请教个路由的问题 HOT 5
- Content-Type 最好能修改 HOT 34
- 关于多库,分权分域的问题 HOT 1
- 后台操作耗时,如何同步? HOT 11
- 升级后mysql连接错误 HOT 5
- 最新代码启动问题 HOT 5
- 目录结构有问题 HOT 1
- 经由cfadmin 后台启动的脚本 或程序 信号量被屏蔽了 HOT 23
- 发现一个稳定性的随机问题 HOT 5
- 建议httpd增加DELETE和PATCH动词的支持 HOT 1
- 大哥,AES_256_GCM加密可以用吗 HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cfadmin.