Delphi 套接字、HTTP查询或5000个已连接客户端的长轮询?

Delphi 套接字、HTTP查询或5000个已连接客户端的长轮询?,delphi,sockets,nginx,rabbitmq,long-polling,Delphi,Sockets,Nginx,Rabbitmq,Long Polling,我有大约5000个用Delphi编写的Windows客户端,驻留在office LAN中,需要访问更新到“云”的新数据,基本上是PHP(IIS)+复制的MySQL网站,托管在2台Windows 2003 VPS机器上,内存为1GB(我可以升级到2GB) 最终用户可以通过Internet访问,这些用户更新的数据需要由驻留在办公室防火墙后面的Windows客户端使用 注意:如果你问为什么客户端在防火墙后面-它们包含关键的公司信息 由于客户端位于防火墙后面,因此客户端必须直接连接到VPS以下载数据更新

我有大约5000个用Delphi编写的Windows客户端,驻留在office LAN中,需要访问更新到“云”的新数据,基本上是PHP(IIS)+复制的MySQL网站,托管在2台Windows 2003 VPS机器上,内存为1GB(我可以升级到2GB)

最终用户可以通过Internet访问,这些用户更新的数据需要由驻留在办公室防火墙后面的Windows客户端使用

注意:如果你问为什么客户端在防火墙后面-它们包含关键的公司信息

由于客户端位于防火墙后面,因此客户端必须直接连接到VPS以下载数据更新

我可以想到几种不同的连接方法:

1)。套接字:在Windows VPS上运行套接字服务器,并让5000个客户端中的每个客户端不断连接到套接字服务器

优点:没有第三方代码。 缺点:低水平。对于同时连接的大量客户端,未知的可扩展性和稳定性。除非我使用的Lazarus还不稳定,否则我暂时坚持使用Windows平台

2)。RabbitMQ:在VPS上运行RabbitMQ(或等效工具),然后让5000个客户端中的每个客户端通过AMQP连接到RabbitMQ服务器。在Windows VPS上,创建一个连接到RabbitMQ的Delphi应用程序,将PHP插入的数据发送到MySQL中

优点:发送数据并忘记-无需使用MySQL管理队列。 缺点:在仅使用简单队列的情况下管理RabbitMQ的复杂性和可能的错误(特别是对于复制)。队列可能会占用大量内存

3)。HTTP查询:对5000个客户端进行编程,每5秒左右向VPS发送一次HTTP GET。如果有更新,HTTP服务器将返回数据,如果没有更新,则发送“无数据”响应

首先,IIS肯定是过时的-我现有的IIS挂起,即使有5个用户正在下载文件-IIS在几分钟后自行重置,不确定是IIS还是VPS

我可以使用Apache(或Nginx)+PHP,或者创建一个定制的delphihttp服务器,如果这样可以提高性能的话。如果我使用PHP,我会为未读数据的客户端创建一个标志文件(或者使用Memcached?)——这是为了防止对队列表进行过多的MySQL查询。对于定制的DelphiHTTP服务器,我可以查询MySQL以每1秒将所有更改(对于所有客户端)加载到内存中

优点:简单易懂,易于实现,可与Apache/PHP一起使用,因此我将来甚至可以切换到Linux。使用SSL易于实现安全性。 缺点:可伸缩性问题-5000个客户端是否可以在不挂起服务器的情况下每5秒查询一次

4)。长轮询?我不熟悉长轮询。与HTTP查询类似,但响应延迟

优点:如果有一个为长时间轮询而构建的web服务器,这将是很有希望的。 缺点:可伸缩性未知

我读过几十篇比较HTTP、套接字和长轮询的文章,但考虑到我使用的服务器资源非常有限,人力和技术专家也非常有限,我仍然不确定应该使用哪种方法

如果你是我,你会用什么?为什么


注意:我也刚刚读到了Memcached,但它不支持Windows上的复制。大多数高度可扩展的web平台和服务器都是针对Unix的,因此我在这方面的选择是有限的。

虽然这是一个很好的问题,恐怕这里的范围太广了。我自己做了进一步的研究,根据这篇文章——似乎HTTP查询比长轮询每GB内存可以处理更多的用户。缺点是CPU使用率,但我想这不会是一个问题,因为我只需要每5-10秒轮询一次?下一个问题是HTTP服务器可以处理的最大并发数。