2015-08-14 31 views
-2

我正在创建基本上具有多个连接到第三方聊天流API(基于套接字)的应用程序。Python或节点中的异步套接字连接

它的工作方式是 - 每个用户在我的应用程序上有一个帐户,在第三方应用程序上有另一个帐户。他为我提供了第三方聊天应用程序的访问令牌,并且我连接到第三方API以流式聊天。这发生在数百名用户身上。

我需要为每个用户创建一个套接字连接池并运行并行线程。我正在使用Python库(针对该API),并能够为单个用户实现实时Feed。如何在Python或NodeJS中实现异步套接字连接池?我在EC2上有一个Linux微型实例,我需要为1000个用户运行这个应用程序。

我在探索Redis + Tornado来实现这一点。有没有更好的选择?

+0

所以基本上你的应用程序应作为客户和第三方API之间的透明代理? – robertklep

+0

@robertklep排序。它代表客户端连接到第三方流媒体API,并过滤一些数据并将其存储在我的数据库中。 – zenCoder

+0

Jquery(客户端)不允许'Socket based'!所有的python MVC都是基于wsgi的。所以分配不是一个好主意。我的观点:共享用户在一个组中,将用户端口划分到位置,'DB == io',因此您需要很多内存以用于延时录制,从不使用服务器端数据进行比较,使用'result'。 – dsgdfg

回答

0

这将是混乱,也是一些事情要考虑。

  1. 如果您打算使用多线程,请记住您每个CPU只能运行如操作系统允许的那么多,而不是multiprocessing
  2. 如果您要使用长轮询过程进行异步,它将阻止其他客户端处理请求。

解决方案

当你的应用程序绝对必须是实时的,我建议为服务器 - 客户端交互的WebSockets。

然后从您的客户端请求启动一个进程,该进程在python中使用multiprocessing在您的流API上侦听\ polls。所以你将基本上为每个客户创建一个单独的过程。

现在,为了让您的WebSocketHandler和Background API Streamer相互交互,您可以使用观察者模式(https://en.wikipedia.org/wiki/Observer_pattern)通知WebSocket您已从API接收数据。

请确保您为每个客户端分配一个唯一的ID,并确保您只在使用websockets时将数据发布到预期的客户端。

编辑:

网站:

也在你的关于龙卷风的问题。这对于运行几个用户来说可能是一个很好的轻量级框架,也许是1000.但是,除了我会建议考虑Django,因为它可以使您在生成代码方面更加高效,而且还有很多工具可用于社区随着时间的推移发展。

数据库:

Red.is是一个不错的选择,如果你需要一个非常快的没有SQL数据库,也看看MongoDB的。如果你需要一个多区域的数据库,我建议由于分区节点而使用Cassandra或CouchDB。下面的图片可能会帮助您更好地决定使用哪个数据库。

enter image description here