Coder Social home page Coder Social logo

Comments (9)

CandyMi avatar CandyMi commented on June 1, 2024

hi
测试过程中发现几个问题:

  1. 如果处理过程等待结果时,其他的都会被阻住。
  2. 如果访问url 导致错误,后续都不再正常了。
  3. 模板读取采用读写打开,只读系统无法工作。
  4. post 的url 参数没有解析。
  5. lua 编译不完全。popen 无法使用。

@suzaichuan

感谢您的热心反馈! 由于回复不及时, 我感到十分抱歉. 下面回复您的问题:

目前我只复现了您提出的Q3问题, 这也是因为aoi库默认用的rw方式打开的原因.(如果要改的话, 只能使用io库)

您这边方便详细描述下问题,给出些许测试用例么?

from cfadmin.

CandyMi avatar CandyMi commented on June 1, 2024

@suzaichuan

Q4的问题是因为POST方法请求我并不会解析url query的值将其放在args参数内.

这是因为已经在httpd.Form库内提供了get_args方法来解析path, 你只需要将url传递进去即可.

from cfadmin.

suzaichuan avatar suzaichuan commented on June 1, 2024

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.

CandyMi avatar CandyMi commented on June 1, 2024

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阻塞只会影响到当前请求.

  1. 我收到Q3review了之前的实现, 对于一些权限控制严谨的环境来说确实会影响到部署; 我非常认同你的观点, 权限范围控制是在项目中必不可少的. 我近期会解决这个问题.

  2. 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.

suzaichuan avatar suzaichuan commented on June 1, 2024

hi
非常抱歉可能问题有的地方描述不清楚。再补充一下
Q1.测试目的是,如果处理被阻塞了,是否影响后续的处理。用sleep只是模拟处理没有退出,cf.sleep,这是人为的让出线程,达不到测试目的。nginx 只开启一个进程也存在这个问题,所以多进程解决。cf目前没有考虑这个情况。
Q2.cfadmin group add 增加的路由,不返回,出错后,就不再正常; 刷新重新登录也还可以。应该与会话管理有关
Q5.在ubutun 16 ,18 下编译出现,后来再arm下交叉编译也同样存在这个问题,popen not support。 修改编译宏,解决。 我的系统都是纯净的,没有事先安装lua 等;最终通过编译可以解决。

from cfadmin.

CandyMi avatar CandyMi commented on June 1, 2024

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.

CandyMi avatar CandyMi commented on June 1, 2024

Q2Q5我可能还需要进一步测试.

或者你看下这边能给出你正在使用的cf版本, 我根据这个版本再跟进下系统编译的更新.

:)

from cfadmin.

suzaichuan avatar suzaichuan commented on June 1, 2024

hi
我是用 上个礼拜一的主干版本。

from cfadmin.

CandyMi avatar CandyMi commented on June 1, 2024

@suzaichuan

我不知道选择的版本是否正确, 所以我选了4个Ubuntu的版本: 18 Desktop/Server, 16 Desktop/Server.

这两天我在虚拟机上与云服务器上测试了一下, 你说的Linux发行版都没出现popen的问题.

是否使用的Linux是自行编译或下载源、版本有差异呢? 我这边用的build.sh应该不会出现没包含popen的问题.

from cfadmin.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.