Web services Delphi 7 Indy 9多线程HTTP服务器

Web services Delphi 7 Indy 9多线程HTTP服务器,web-services,delphi,webserver,indy,httpserver,Web Services,Delphi,Webserver,Indy,Httpserver,我需要编写一个多线程HTTP服务器。我知道Indy通过IdThreadMgrPool处理线程 我的要求很简单:有一个同时接受多个客户端(web浏览器POST请求)的服务器,运行有限数量的调用Delphi DLL的线程(可能与连接线程分离),并返回结果 无阻塞将是最终的解决方案(如node.js) 关于这个话题,有几个SO帖子。我在这里(或通过谷歌)找不到的是如何使用IdThreadMgrPool的示例。我看到一些帖子说必须使用它,但没有例子说明如何使用。印地的网站上也没有这样的例子 有人能给我举

我需要编写一个多线程HTTP服务器。我知道Indy通过IdThreadMgrPool处理线程

我的要求很简单:有一个同时接受多个客户端(web浏览器POST请求)的服务器,运行有限数量的调用Delphi DLL的线程(可能与连接线程分离),并返回结果

无阻塞将是最终的解决方案(如node.js)

关于这个话题,有几个SO帖子。我在这里(或通过谷歌)找不到的是如何使用IdThreadMgrPool的示例。我看到一些帖子说必须使用它,但没有例子说明如何使用。印地的网站上也没有这样的例子

有人能给我举个例子吗?或者是否有一个FOS框架可用于此


一个想法是让Indy正常生成多个线程,然后让这些线程访问运行DLL的受控线程池。如果这是合理的,那么我只需要知道“正常”用例用法示例。

要使用
TIdThreadMgrPool
,至少需要创建它的实例,将其分配给
TIdHTTPServer.ThreadMgr
属性,并设置其
PoolSize
属性。所有这些都可以在设计时完成

请记住,
PoolSize
不会限制服务器上的连接数。为此,服务器有自己的
MaxConnections
属性。例如,您可以将
PoolSize
设置为10,同时连接15个客户端,从而运行15个线程。当它们断开连接时,10个线程将被放回池中,5个线程将被终止

要自定义池线程,您可以从
TIdPeerThread
派生一个新类,可以选择重写其虚拟
BeforeExecute()
AfterExecute()
方法来执行每线程初始化清理,然后将该类分配给服务器(而不是ThreadMgr)
ThreadClass
属性,然后再激活服务器。在服务器事件处理程序中,您可以将提供的
TIdPeerThread
对象类型转换为自定义类,并根据需要使用它

您可以向自定义线程类添加方法,并让它们在内部访问DLL,根据需要进行节流。最简单的限制是使用单个共享信号量来控制每次可以进入信号量的线程数。在这方面,您可以一次限制为2个线程,即使有15个线程正在运行

因为你说你想“在线程中运行DLL”,信号量可能是不够的。在这种情况下,我建议改为使用。您可以让自定义线程类使用向IOCP发布请求,并等待响应返回。通过创建为IOCP服务的线程数(例如每个CPU核一个线程)来实现限制。每个IOCP线程将在一个循环中使用以接收已发布的请求


Indy不是异步的,因此您无法将请求发布到IOCP,并让它在准备就绪时直接将响应发送回客户端。服务器使用管理客户端连接的同一线程将响应发送回客户端。因此,客户端线程必须向IOCP发送请求并等待其响应,然后将该响应发送给客户端。您可以定义一条记录,其中包含
TEvent
、调用DLL所需的输入值以及DLL响应的输出值。然后创建该记录的一个实例,将指向它的指针发布到IOCP,并等待
TEvent
发出信号。当IOCP线程接收到记录指针时,它可以根据需要调用DLL,用响应填充记录,然后向记录的
TEvent
发送信号。等待的客户端线程将被解锁,并可以根据需要将记录的响应数据发送到客户端。

Indy server的扩展性不好

考虑使用基于iocp的http.sys内核模式服务器

我们的开源SynCrtSock单元具有高性能http服务器,从Delphi5到XE6都能完美工作


例如,请参阅。

如果您有可用的Windows服务器,我建议您使用Delphi 7编写ISAPI DLL并将其部署到IIS上,这将处理所有服务器端问题,特别是如果您的server 2008 R2具有IIS 7.5(或更高版本)的话。您的客户端可以使用Indy连接到IIS,Indy客户端与Delphi ISAPI的请求/响应模型相结合,支持多种功能,使您可以轻松地将数据从客户端传递到服务器端请求处理程序并返回到客户端不需要ASP.NET-所有本机Delphi和“经典”ISAPI应用程序模型

Delphi 7将生成ISAPI应用程序代码-当IIS将请求发送到DLL时,您将获得一个操作编辑器来处理请求,这由客户端发送的URL决定。您可以持久保存会话信息,创建全局缓存,并且基本上可以在ISAPI DLL的上下文中使用VCL的所有非可视方面

IIS处理线程-可能会处理比您需要的多得多的并发连接-还可以让您确定一次可以加载多少DLL实例,以及许多其他选项,如回收、各种形式的身份验证和安全级别。您可以使用IIS的应用程序池功能进行扩展等

我使用这种架构开发了几个大型企业级解决方案(嵌入Delphi exe的Indy客户端)。一旦您了解了Delphi的ISAPI应用程序模型和IIS部署的bugaboos的基础知识,它就稳定且相对“无痛”

如果你有这个选择,为什么要重新发明轮子

请参见此处的示例:

线程池逻辑如下:

阿克图