【问题标题】:Live chat application using Node JS Socket IO and JSON file使用 Node JS Socket IO 和 JSON 文件的实时聊天应用程序
【发布时间】:2014-03-08 18:13:46
【问题描述】:

我正在使用 Node JS、Socket IO 和 JSON 文件开发一个实时聊天应用程序。我正在使用 JSON 文件来读取和写入聊天数据。现在我被困在一个问题上,当我进行压力测试时,即将连续消息推送到 JSON 文件中,JSON 格式变得无效,我的应用程序崩溃了。虽然我正在使用 forever.js,它应该保持应用程序正常运行,但应用程序仍然崩溃. 有人对此有想法吗? 提前感谢您的帮助。

【问题讨论】:

  • 你为什么首先使用文件?
  • 因为我不想用DB来保存记录。其次,从文件中读取/写入变得更快。
  • 键值存储甚至关系数据库仍然比磁盘 IO 快。测试一下。
  • 您说 JSON 格式无效并且应用程序崩溃... forever.js 如何帮助您,因为当它再次启动您的应用程序时,它会再次发现 JSON 格式无效。您应该使用“mongodb”,因为它支持快速插入和检索。我有个人经验,像mongodb这样的NoSQL数据库比SQL数据库和文件系统快很多。
  • 我为每个聊天保留单独的 JSON 文件。所以我的观点是,如果任何一个聊天文件变得无效,它不应该让应用程序崩溃,它应该只停止与无效 JSON 文件的聊天。

标签: json node.js socket.io forever


【解决方案1】:

强烈建议您重新考虑将数据持久化到磁盘的方法。

除其他外,一个真正的大问题是您可能会遇到数据丢失。如果我们俩同时获得文件 - {"foo":"bar"} - 我们都进行了更改并且您将其保存在我之前,我的更改将覆盖您的更改,因为我开始与您相同。虽然你在我之前保存了它,但是在你保存之后我没有重新打开它。

您现在在仅附加方法中可能看到的是,我们都在添加点点滴滴,而不考虑有效的 JSON 结构(即:{"fo"bao":r":"ba"for"o"} from {"foo":"bar"} x 2)。

磁盘 I/O 实际上很慢。即使使用 SSD 硬盘。记忆就在它所在的地方。

按照建议,您可能需要考虑 MongoDBMySQL 或其他方式。对于Couchbase,这可能是一个不错的用例,它是一个基于内存缓存的内存键/值存储,可以尽快将内容保存到磁盘。它对 JSON 非常友好(它实际上主要基于 JSON),为查询数据提供了强大的 map/reduce 支持,非常容易扩展到多个服务器,并且有一个 node.js module

这将使您能够非常轻松地将现有的数据存储例程迁移到数据库中。此外,它还提供CAS 支持,可以防止您在前面概述的场景中丢失数据。

不过,您至少应该只修改一个经常保存到磁盘的内存对象,以防止数据永久丢失。但是,这只适用于 1 台服务器,然后您可能需要查看数据库。

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2020-01-18
    • 2019-03-09
    • 1970-01-01
    • 2017-11-18
    • 2016-04-12
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多