|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2022/11/30 9:28:17 |
标题: |
自己简单弄了个http服务端,简单测试,大家讨论讨论 |
浏览:2094 |
|
加入我的收藏 |
楼主: |
自己简单弄了个http服务端,请求一次独立线程完成一次,完成后释放资源,线程结束,没有任何多余的操作,也就是短链接吧,不存在什么链接问题。像图片那样开4个客户端,不停的循环在获取数据,服务端内存之类的占用没有变化不大,也试过开几十个客户端不停循环获取数据,因为请求一次返回数据就完成了,因为是短链接,所以服务端不怕死机,就是死了随便重开,在阿里云服务器上运行大概7天左右,四个客户端累计访问了150万次左右,平均每天20多万次访问,如下图,所谓并发,阿里服务器本机用远程外网ip用ab测试,怎么测都没问题,但是用自己电脑连阿里服务器测就测不了,具体不太懂,不知道是不是测试方法不对,请大家指点指点~像这样的服务端是否可以那来应用?欢迎大家讨论讨论~
此帖子包含附件:
大小:266.1K |
----------------------------------------------
- |
作者: |
|
2022/11/30 9:42:28 |
1楼: |
本机没问题,外网访问不到,可能是防火墙端口没开放
----------------------------------------------
-
|
作者: |
421 (421) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/11/30 11:05:14 |
2楼: |
阿里云服务器需要在安全组里打开你的入方向8080端口
----------------------------------------------
-
|
作者: |
|
2022/11/30 11:11:09 |
3楼: |
其实真正可以使用的http服务,在现实生产中,都是应该和数据库关联使用的,十有八九是要读取数据库,然后返回数据的,一般是返回json格式的较多,所以怎么处理在http服务中读取数据库的数据,是关键技术问题,就是多线程下,怎么读取数据库,并且返回需要的统计数据给客户端。目前大家看到的文章,都是返回所谓的网页信息,根本不实用。
----------------------------------------------
-
|
作者: |
siaosa (siaosa) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/11/30 11:35:24 |
4楼: |
代码放上来。研究一下。
----------------------------------------------
-
|
作者: |
|
2022/11/30 12:43:20 |
5楼: |
被你这么一说我想“白嫖整套代码” 刑么。
----------------------------------------------
-
|
作者: |
|
2022/11/30 13:25:07 |
6楼: |
3 楼,你说的是现在流行的 RESTful 服务。
经典的 HTTP 服务器当然是返回页面。页面里面的数据当然也可以是来自数据库。
如果前端是浏览器,对于浏览器来说,最终都是显示 HTML。只不过,经典做法是服务器端向数据库获取数据以后组装好 HTML 字符串发送给浏览器显示;RESTful 是服务器端查询数据库后只返回数据(至于是 JSON 还是 XML 其实无所谓,当然现在用 JSON 格式的比较多)给浏览器,浏览器里面用 JS 代码把数据再组装为页面让浏览器显示。
本质上干的事情都一样,只是看这些事情如何分工,哪一部分在服务器干,哪一部分在客户端干。如何分工其实都有道理,看具体应用场景。
----------------------------------------------
-
|
作者: |
|
2022/11/30 13:55:25 |
7楼: |
可以参考一下Nginx的思路,它是N个进程,一般N是处理器个数或者处理的2倍。 Delphi上比较好的是 Delphi-Cross-Socket
----------------------------------------------
武稀松http://www.raysoftware.cn
|
作者: |
kwer (★★★★★) |
★☆☆☆☆ |
-
|
普通会员 |
|
2022/11/30 14:37:32 |
8楼: |
你先测试一下端口通不通? 测试工具也很多
----------------------------------------------
==========-==========-==========-==========-========== 多隆, 给我备一匹最快的马, 我有事要走先~~~ ==========-==========-==========-==========-==========
|
作者: |
|
2022/11/30 17:05:09 |
9楼: |
简单的HTTP服务器(小麻雀迷你Web服务器),是开发前端测试的时候做的一个Web服务器工具,并发没有任何问题! 试下看,使用HTTP.sys核心(有使用帮助和说明)
https://szhn.myds.me:55556/wordpress/sdm_downloads/webserver/
1.实现Web文件服务器功能(静态);
2.绿色软件,无需安装,占空间小,3M多点;
3.设置简单,只需设置两个参数,即可立即实现Web服务器功能;
4.使用windows的HTTP.SYS内核,天然支持高并发;
5.系统级支持ssl;
6.支持端口复用,默认使用80端口,可以设置任意端口;
7.调试前端的工具;
----------------------------------------------
喜欢编程的一个DOS级程序员
|
作者: |
|
2022/11/30 18:32:33 |
10楼: |
1楼,2楼,我上面写着就算是在阿里服务器上面也是连阿里外网ip,而且我本机同样客户端也可以连阿里服务器外网ip获取数据,是可以正常读取获取数据的。所以不是上面你说的连接不通和设置的问题~,就算在阿里服务器上面运行用外网ip连接不等于用本地127.0.0.1直连,等于去外面逛了一圈再回来。
----------------------------------------------
-
|
作者: |
|
2022/11/30 18:34:04 |
10楼: |
一次请求就一个现程?这种构造其实很不好。 频繁的构造释放内核对象会产生海量的碎片,会引起不可预测的问题。 而且本身又有2000个极限链接的问题。
现在一般的做法都是用队列来解决,当然这样又会产生许多其他问题,必如资源占先问题,群惊问题,雪球问题等。
----------------------------------------------
--
|
作者: |
|
2022/11/30 18:37:49 |
11楼: |
回3楼,我的服务端,可以返回任何数据类型,主要实现是发流,如果你要发什么格式随便封装成流在客户端还原需要的格式就可以了,不是单单网页,可以自定义自己的返回数据格式,当然最简单的就是dataset转化流,传到客户端流再转化dataset的方式。dataset数据可以是json,xml,文件,图片,文字,等等,自己喜欢什么就封装什么就可以了。客户端操作就等于服务端操作数据库那样,没啥区别~
----------------------------------------------
-
|
作者: |
|
2022/11/30 18:41:05 |
12楼: |
回4楼,5楼,不劳而获的事情呢就别想太多了。代码只是想法的实现,你有想法自然就能实现了,再说我的代码我自己都不忍看,就更别发布出来给大家了,把好的想法和大家分享讨论不是更好~!
----------------------------------------------
-
|
作者: |
|
2022/11/30 18:47:06 |
13楼: |
核心不是返回什么数据,关键是如何获取数据的过程,比如要从数据库获取数据,这个过程,是很考验编程功力的。
----------------------------------------------
-
|
作者: |
|
2022/11/30 18:52:57 |
13楼: |
回10楼,线程2000你估计停留在个人版的系统,server系统我好想有印象不止2000了吧,当然如果我说错了就当我错了。
短链接的方式,如果你线程用到了2000,服务数据处理量不小了,估计并发量是个不小的数了,到这时候,单单靠一个服务数据处理可能不够了,你肯定会加入考虑分布式服务器了。更要进一步服务合理分布了,不是单单靠一个服务了。
频繁构造,像你说的那可能就是程序不稳定了,代码不完善导致的多了,如内存泄漏,等等这些,这些应该是编程代码问题了,只要代码逻辑严谨些,估计你说的问题应该是可以避免的, 再说我前面有说,服务端不怕死机,可以随便重启,这时候短链接的方式就体现他的价值了,你提交一次服务端死了,重启服务端,只需重新提交下就可以了。对客户端根本就没感觉什么当没发生过。
----------------------------------------------
-
|
作者: |
|
2022/11/30 18:57:00 |
14楼: |
回13楼,返回数据不是很简单吗,服务端qry获取数据库数据,转成流,然后经过httpserver把流发给客户端,客户端再把流转换一下变成dataset数据然后就可以正常像qry那样使用了,这不是很简单吗?
----------------------------------------------
-
|
作者: |
|
2022/11/30 21:39:16 |
15楼: |
14楼,你测试一下,按你这样做法,大概5个客户端,你的服务就宕机了。
----------------------------------------------
-
|
作者: |
|
2022/11/30 22:23:58 |
16楼: |
嗯?我有说长短链接的问题么?
线程2000只是理想状态,实际上只是32位进程的理论极值罢了,实际应用能有一半就不错了。这个跟进程与线程的资源占用以及系统调度有关,这里就不铺开详解了。 当然你可以改用64位,但是目前常见的win系统其实只是48位的,大概按寻址空间可以算出来最高可以支持多少并发。
但是,这都不是问题,频繁的创建、销毁内核对象所产生的碎片以及开销是不可以接受的,或许楼主没有实际的运营过吧。一般来说真要这样搞,你不如用多进程来处理,那样反而会比多线程来的好一些。
我记得以前曾经搞过一个以破坏为第一目的的小工具,在win2008系统上,大约只要10几个并发就能大幅度拖慢系统的处理速度。 当然,我当时的硬件性能比现在是相去甚远,但是要是翻十倍呢?还能流畅么?
----------------------------------------------
--
|
作者: |
|
2022/12/1 14:27:29 |
17楼: |
回15楼,我上面测试的客户端就是我14楼说的那样操作方式的,别说5个客户端,到今天,我现在都开了4个客户端在循环了上3百万次多次访问了,没感觉服务端有变化和~,而且我开始就说过,开了20,30多个客户端一起循环访问获取数据,都没有变化~,所以请看看前面的我的,所以几个客户端根本不在话下。
----------------------------------------------
-
|
作者: |
|
2022/12/1 14:42:08 |
18楼: |
回16楼,我的意思不是说长短链接的问题,我意思是说我服务端的想法是,短链接,一个访问一个链接,一链接服务端一线程处理完成返回,也就是等于短链接一次,一次线程,链接完了,线程也就完了,所以一般需要并发的情况下才会线程的并发,当然你上面说的问题,我不会否认会不会出现,当然我也希望在测试的时候能出现,所以我也希望找个方法看看能不能弄出你说的那样情况,测试本身就是希望这样,所以我也想大量并发测试下,只是不太懂得并发测试~,我也在上面说过用网上搜索的ab并发测试,但不太懂是不是正确使用,下面截个图给大家看看,指点指点下,谢谢~ -------- abs.exe -n 10000 -c 2000 http://127.0.0.1:8080/ 按网上搜索的介绍,上面链接的测试就是10000次并发,2000客户端 下图就是返回的结果,大家看看,指点指点下,谢谢~
此帖子包含附件:
大小:81.7K |
----------------------------------------------
-
|
作者: |
jfet (jfet) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/12/2 8:19:42 |
19楼: |
这种东西都是标准实现了啊,就别自我创造发明了吧
Windows上你逃不过完成端口 Liunx上你逃不过epoll 其他的方案就是玩
有时间你看看几个流行库或者golang的实现,底层都是这几个API Windows上高性能HTTP完整实现可以直接用http.sys,这个系统API怎么也比自己的玩的好
另外线程创建数目和“栈”相关和32位还是64相关,没有啥服务器版和个人版的概念
----------------------------------------------
-
|
作者: |
abencat (远离delphi的人) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/12/2 10:00:14 |
20楼: |
go-gin 两行代码开启http服务,并发上万稳定 很香
----------------------------------------------
delphi爱好者
|
作者: |
|
2022/12/14 14:45:29 |
21楼: |
实际应用连接数据库操作,问题慢慢就出来了
----------------------------------------------
-
|
|