【问题标题】:Asynchronous Socket connections in Python or NodePython 或 Node 中的异步 Socket 连接
【发布时间】:2015-11-07 08:14:49
【问题描述】:

我正在创建一个应用程序,它基本上与第三方聊天流 API(基于套接字)有多个连接。

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

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

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

【问题讨论】:

  • 所以基本上你的应用应该充当客户端和第三方 API 之间的透明代理?
  • @robertklep 有点像。它代表客户端连接到第三方流 API,并过滤一些数据并将其存储在我的数据库中。
  • Jquery(客户端)不允许Socket based!所有 python MVC 都是基于 wsgi 的。所以分发不是一个好主意。我的意见:共享组中的用户,将用户端口划分为位置,DB == io,因此您需要大量内存来进行延时录制,切勿使用服务器端数据进行比较,使用result

标签: python node.js sockets asynchronous tornado


【解决方案1】:

这会很混乱,还有一些事情需要考虑。

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

解决方案

当您的应用程序绝对需要实时时,我建议使用 websockets 进行服务器-客户端交互。

然后从您的客户端请求启动一个进程,该进程在 python 中使用 multiprocessing 在您的流 API 上侦听\轮询。因此,您实际上将为每个客户创建一个单独的流程。

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

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

编辑:

网站:

还有关于你关于龙卷风的问题。它是一个很好的轻量级框架,可以运行几个用户,可能有 1000 个用户。但除此之外,我建议看一下 Django,因为它可以让你在生成代码时更有效率,而且还有很多工具可供社区使用随着时间的推移而发展起来。

数据库:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2023-04-08
    • 2017-11-22
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多