【问题标题】:How to maximize efficiency in this complex data transfer scenario如何在这种复杂的数据传输场景中最大限度地提高效率
【发布时间】:2013-11-26 08:57:45
【问题描述】:

我不确定这个问题是否属于这里,因为它仅基于理论,但是我认为与其他问题相比,这最适合这个 stackexchange。

我有 500,000 辆出租车,里面装有 Android 4 电脑。每天,在一个人或一方旅行后,计算机会将有关旅行的信息发送到 Node.js 服务器。每天大约有 35 次行程,这意味着 500,000 辆出租车 * 35 次行程 = 17,500,000 份报告每天发送到 Node.js 服务器。此外,每份报告中大约有 4000 个字符,大小约为 5KB。

出租车计算机发送到 node.js 服务器的报告只是一个 http 帖子。然后 Node.js 将向出租车发回确认信息。如果出租车在规定的时间内没有收到报告 A 的确认,它将重新发送报告 A。

node.js 服务器只接收报告。将确认信息发送回出租车。然后将完整的报告发送到 MongoDB。

一个潜在的问题:出租车 1 将报告 A 发送到 node.js。 Node.js 在分配的时间内没有响应,因此 Taxi 1 将报告 A 重新发送到 node.js。 Node.js 最终会处理所有内容并将报告 A 两次发送到 MongoDB。

因此,MongoDB 负责检查它是否收到了多个相同的报告。然后 MongoDB 插入数据。

我实际上有几个问题。这对 NodeJS 来说是不是太多了(我不这么认为,但这可能是个问题)?这对 MongoDB 来说是否太多了?我觉得检查重复报告可能会严重影响性能。

如何让整个系统更高效?我应该更改或添加什么?

【问题讨论】:

  • 我会给你的报告一个哈希值(可能来自旅行的时间戳和出租车 ID),索引它们并将它们缓存在你的 node.js 服务器中一定的时间。如果您收到报告,只需检查最近的哈希值,如果您已经拥有此哈希值,则不要进一步处理
  • 不是每次旅行都通知服务器,你能把一组旅行的数据发送到服务器吗?就像每 7 次旅行后,您将向服务器发送数据。这样,每辆出租车的请求/响应数量将减少。
  • 同意 RafaelT。最好生成哈希,然后发送报告。有什么让我感到困扰的是,一次最大并发出租车请求是多少?在一天中平均分配 17,500,000 个请求是没有意义的。您的 500,000 辆出租车将迎来高峰期。知道这个数字很重要。
  • @Shrikant 是的,这当然是可能的,因为当前系统现在每天结束时都会发送一个日志文件。但“实时”方面似乎有某种光芒(至少在公司眼中)。

标签: android node.js mongodb performance database


【解决方案1】:

第一个潜在问题很容易克服。计算行程的哈希值并将它们存储在 mongo 中。将键放在该字段上,然后比较每个下一个文档(如果存在相同的哈希)。这种检查重复的方式将非常容易且非常快速。请记住,此文档不应包含发送时间之类的内容。

第二个问题:17,500,000/天是 196/秒虽然听起来很吓人,但实际上对于像样的服务器来说并没有那么多,对于 Mongodb 来说肯定不是问题。

很难说如何让它更有效率,我非常怀疑你现在应该考虑一下。试一试,做点什么,检查哪些地方不能有效工作,然后再提出具体问题。

附:不要在 cmets 中回答所有这些问题。您必须了解这个问题非常模糊。没有人知道你所说的旅行文件是什么意思,它有多大。可以是 1kb,可以是 10Mb,也可以是 100Mb(大于 16 Mb mongodb 限制)。没人知道。当我说 196 个文档/秒没有问题时,我并没有说这个文档数量是最大的上限,所以即使是 2、3 倍,听起来仍然是可行的。

您必须自己尝试。以平均亚马逊实例为例,看看它每秒可以保存多少您的文档(创建接近您的大小和结构的文档)。如果不能处理,试试看能处理多少,或者amazon big instance能处理。

我给你一个粗略的估计,这是可能的,我不知道你想“包括使用 MongoDB 的管理员,以更新、选择”。你在你的问题中告诉过这个吗?

【讨论】:

  • 关于您的第二个问题:17,500,000/天转换为比 196/秒多得多。在非高峰时段,出租车不会发送那么多报告,而在高峰时段,几乎不可能找到出租车。我目前没有高峰时段的统计数据,但我可以努力做到这一点。我刚刚编辑了我原来的问题,指出报告的平均大小是 4000 个字符,5KB。 MongoDB 是否能够处理这种更新情况下的压力(在检查重复报告和插入之间)?
  • 这甚至不包括使用 MongoDB 进行更新、选择等的管理员。
猜你喜欢
  • 2011-03-24
  • 1970-01-01
  • 2014-08-27
  • 2022-11-24
  • 2022-01-16
  • 2018-06-16
  • 1970-01-01
  • 2012-04-01
  • 2020-04-08
相关资源
最近更新 更多