Python 或 Node 中的异步套接字连接
Asynchronous Socket connections in Python or Node
我正在创建一个基本上与第三方聊天流有多个连接的应用程序 API(基于套接字)。
它的工作方式是 - 每个用户在我的应用程序上都有一个帐户,在第三方应用程序上有另一个帐户。他给了我一个第三方聊天应用程序的访问令牌,我连接到第三方 API 以流式传输他的聊天。数百名用户都会遇到这种情况。
我需要为每个用户和 运行 个并行线程创建一个套接字连接池。我正在使用 python 库(对应 API)并且能够为单个用户实现实时提要。如何在 Python 或 NodeJS 中实现异步套接字连接池?我在 EC2 上有一个 Linux 微型实例,我需要 运行 这个应用程序供 1000 个用户使用。
我正在探索 Redis+Tornado 来实现这个。有没有更好的选择?
这会很混乱,还有一些事情需要考虑。
- 如果您打算使用多线程,请记住,在 OS 允许的情况下,每个 CPU 只能 运行 多个线程,而不是
multiprocessing
。
- 如果您要与长轮询进程异步,它将阻止其他客户端处理请求。
解决方案
当您的应用程序绝对需要实时时,我建议使用 websockets 进行服务器-客户端交互。
然后,根据您的客户请求,在 python 中使用 multiprocessing
在您的流媒体 API 上启动单个进程 listens\polls。因此,您实际上将为每个客户创建一个单独的流程。
现在,要让您的 WebSocketHandler
和后台 API Streamer 相互交互,您可以使用观察者模式 (https://en.wikipedia.org/wiki/Observer_pattern) 通知 WebSocket 您已收到数据来自 API。
确保为每个客户端分配一个唯一的 ID,并确保在使用 websockets 时只post 将数据发送给目标客户端。
编辑:
网址:
关于你关于 Tornado 的问题。对于 运行 几个用户(可能是 1000 个)来说,它是一个很好的轻量级框架。但除此之外,我建议查看 Django,因为它可以让你更高效地生成代码,而且还有很多工具在那里,社区随着时间的推移而发展。
数据库:
Red.is 是一个不错的选择,如果你需要一个非常快的 no-sql db,也可以看看 mongodb。如果您需要一个多区域数据库,由于分区节点,我建议您使用 Cassandra 或 CouchDB。下图可能会帮助您更好地决定使用哪个数据库。
我正在创建一个基本上与第三方聊天流有多个连接的应用程序 API(基于套接字)。
它的工作方式是 - 每个用户在我的应用程序上都有一个帐户,在第三方应用程序上有另一个帐户。他给了我一个第三方聊天应用程序的访问令牌,我连接到第三方 API 以流式传输他的聊天。数百名用户都会遇到这种情况。
我需要为每个用户和 运行 个并行线程创建一个套接字连接池。我正在使用 python 库(对应 API)并且能够为单个用户实现实时提要。如何在 Python 或 NodeJS 中实现异步套接字连接池?我在 EC2 上有一个 Linux 微型实例,我需要 运行 这个应用程序供 1000 个用户使用。
我正在探索 Redis+Tornado 来实现这个。有没有更好的选择?
这会很混乱,还有一些事情需要考虑。
- 如果您打算使用多线程,请记住,在 OS 允许的情况下,每个 CPU 只能 运行 多个线程,而不是
multiprocessing
。 - 如果您要与长轮询进程异步,它将阻止其他客户端处理请求。
解决方案
当您的应用程序绝对需要实时时,我建议使用 websockets 进行服务器-客户端交互。
然后,根据您的客户请求,在 python 中使用 multiprocessing
在您的流媒体 API 上启动单个进程 listens\polls。因此,您实际上将为每个客户创建一个单独的流程。
现在,要让您的 WebSocketHandler
和后台 API Streamer 相互交互,您可以使用观察者模式 (https://en.wikipedia.org/wiki/Observer_pattern) 通知 WebSocket 您已收到数据来自 API。
确保为每个客户端分配一个唯一的 ID,并确保在使用 websockets 时只post 将数据发送给目标客户端。
编辑:
网址:
关于你关于 Tornado 的问题。对于 运行 几个用户(可能是 1000 个)来说,它是一个很好的轻量级框架。但除此之外,我建议查看 Django,因为它可以让你更高效地生成代码,而且还有很多工具在那里,社区随着时间的推移而发展。
数据库:
Red.is 是一个不错的选择,如果你需要一个非常快的 no-sql db,也可以看看 mongodb。如果您需要一个多区域数据库,由于分区节点,我建议您使用 Cassandra 或 CouchDB。下图可能会帮助您更好地决定使用哪个数据库。