【问题标题】:websocket data collection designwebsocket数据采集设计
【发布时间】:2017-12-02 18:29:12
【问题描述】:

我在这里有一个更开放的设计导向问题。我有 Python 方面的背景,但没有网络或异步编程方面的背景。我正在编写一个应用程序来保存从 websockets 24/24、7/7 收集的数据,以尽量减少数据丢失。

我最初的想法是使用带有 asyncio、aiohttp 和 aiofiles 的 Python 3.6。

我不知道是每个 websocket 连接使用一个协程还是每个 websocket 连接一个线程。与良好的连接错误处理相比,性能可能不是问题。

【问题讨论】:

  • 我的第一个想法是使用真实的数据库,例如。 Postgres 不是普通文件和 aiofiles。
  • 由于我需要不经常访问历史文件和压缩,我看不到优势。使用数据库,我需要维护架构、迁移、...
  • 无论如何,您都需要维护架构和迁移,而无需数据库的所有帮助。您是否要实现写入人员日志并在内存中缓存,线程管理(隐含在 aiofiles 中)是否与使用 db 一样复杂,二进制数据打包和酸性事务如何,因此不完整的写入不会损坏你的数据。如果你正确地完成了这项工作,你最终会得到一个数据库的大部分内容,但工作量更大,需要维护的东西也更多,而且效果更差。
  • 数据是数字还是文本?
  • 它主要是数字,但也有文本和日期。我更关心保存历史而不是使用(全部)它 - 所以不需要担心前面的模式。 20 个数据 websocket 源的架构不同,因此当我可以直接保存原始数据(并压缩它)时,维护它似乎很昂贵。写不全?事实上,我假设我不会使用 aiofiles 损坏数据。我不知道这是否会成为一个问题,有兴趣了解更多关于这方面的信息。

标签: python websocket cloud aiohttp python-aiofiles


【解决方案1】:

要回答您的实际问题,线程和协程同样可靠,但协程更容易推理,并且您会发现要阅读或复制的大部分现代现有代码都将使用它们。

如果您想从多核中受益,使用多处理比使用线程要好得多,以避免 GIL 的棘手。

【讨论】:

  • 谢谢。该应用程序将主要是 I/O(听 20 个 websocket,每天保存几 GB 的压缩数据),所以我猜测单个进程在性能方面就足够了。但是,我确实想知道健壮性:如果我为每个数据源设置一个进程,那么错误只会导致一个源的数据丢失。当然,我也应该能够使用协程处理错误(当我检测到错误时回调以重新启动),但我不知道在实践中什么是最好的。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2015-02-20
  • 2012-07-15
相关资源
最近更新 更多