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

时间:2014-07-18 10:39:38

标签: delphi sockets nginx rabbitmq long-polling

我有大约5000个用Delphi编写并存放在办公室局域网中的Windows客户端,这些客户端需要访问更新到“云”的新数据,基本上是PHP(IIS)+复制的MySQL网站2 x具有1GB RAM的Windows 2003 VPS计算机(我可以升级到2GB)。

最终用户可以通过互联网访问,这些用户更新的数据需要由位于办公室防火墙后面的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肯定已经出局 - 即使有5个用户正在下载文件,我的现有IIS也会挂起 - 几分钟后IIS会自行重置,不确定它是IIS还是VPS。

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

专业人员:傻瓜证明并且最容易实现并且可以与Apache / PHP一起使用,因此我将来甚至可以切换到Linux。使用SSL轻松实现安全性。 缺点:可伸缩性问题 - 5000个客户端是否可以每5秒查询一次而不会挂起服务器。

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

优点:如果有一个为长时间轮询而构建的网络服务器,那将是有希望的。 缺点:可扩展性未知。

我已经阅读了数十篇比较HTTP与Socket与长轮询的文章,但鉴于我使用的服务器资源非常有限且人力有限,我仍然不确定应该使用哪种方法。技术专家。

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

注意:我刚刚阅读了Memcached,但它不支持Windows上的复制。大多数高度可扩展的Web平台和服务器都适用于Unix,因此我的选择在这方面受到限制。

0 个答案:

没有答案