【问题标题】:Can this technology stack scale? [closed]这种技术堆栈可以扩展吗? [关闭]
【发布时间】:2016-11-11 18:35:12
【问题描述】:

我的客户要求我构建一个可以实时聊天、发送图像和视频的实时应用程序。他让我想出自己的技术栈,所以我做了很多研究,发现最容易构建的是使用低于技术栈的技术

1) Node.js 和集群以最大化一个服务器实例的 CPU 核心 - 语言

2) Socket.io - 实时框架

3) Redis - 发布/订阅多个服务器实例

4) Nginx - 反向代理和负载均衡多个服务器

5) Amazon EC2 - 运行服务器

6) Amazon S3 和 CloudFront - 保存图像/视频并交付

如果我对上述堆栈有误,请纠正我。我真正的问题是,上述技术堆栈可以每秒处理 1,000,000 条消息(文本、图像、视频)吗?

任何使用过 node.js 和 socket.io 的人都可以给我一些见解或上述堆栈的替代方案。

问候,

SinusGob

【问题讨论】:

  • 如果你想使用 socket.io 进行推送通知,我建议你使用 APN、GCM,所以对于聊天服务器,我建议你使用 XMPP 开源实现,如 WhatsApp 等
  • 这是一个有点幼稚的问题。一个每秒可以处理 1,000,000 条消息的系统能否由您命名的部分构建而成。是的。您或我们是否知道需要多少服务器、负载平衡器、带宽、网卡和其他自定义开发等……才能达到这个规模。不。这里几乎没有详细说明要走那么远。
  • 如果您可以在 5 毫秒内处理一条消息(这是一个凭空产生的疯狂数字,因为您根本没有提供任何上下文来知道服务器需要做什么),那么您可以这样做200 条消息/秒/核心,这需要 5000 个核心和相当多的网络带宽才能处理 1,000,000 条消息/秒。我建议您开始构建可以开始运行测试的概念验证测试工具。这是真正知道您是否可以做您需要做的事情的唯一方法。测量。
  • @jfriend00 我知道这是一个有点幼稚的问题,但是我的客户问我是否可以将其扩展到每秒 1mill 消息,我不知道该回复什么。这就是我在 SO 上问的原因
  • 唯一真正的答案是它可以构建,但您必须进行概念验证研究(费用由您的客户承担)才能准确估计需要多少基础设施以 1,000,000 条消息/秒的速度解决他们的特定问题。而且,您需要教育客户,任何其他提供不同答案的人都是在吹嘘他们的 xxxx,因为这些不是可以用这种信息水平回答的问题,也没有原型的测量/基准测试。必须了解、原型化和测量更多细节。

标签: node.js amazon-ec2 architecture redis socket.io


【解决方案1】:

我真正的问题是,上述技术堆栈能否扩展 1,000,000 条消息 每秒(文本、图像、视频)?

当然可以。具有正确的设计和足够的硬件。你的客户应该问的问题实际上不是它是否可以做得那么大,而是它的成本和实用性是多少,是最好的选择。

让我们看看你提到的每一件作品:

node.js - 对于以 I/O 为中心的应用程序,它是大规模扩展的绝佳选择,并且可以通过在集群中部署多个 CPU 来扩展(每台服务器多进程和多进程)服务器)。这种规模的实用性在很大程度上取决于所有这些服务器进程需要访问什么样的共享数据。通常,数据存储最终会成为扩展中更难的瓶颈,因为很容易在请求处理中投入更多的服务器。在集中式数据存储中投入更多硬件并不容易。有很多方法可以做到这一点,但这在很大程度上取决于应用程序对你如何做到这一点以及它有多难的要求。

socket.io - 如果您需要高效的服务器推送小消息,那么 socket.io 可能是最好的选择,因为它在向客户端推送方面效率最高。不过,它在所有类型的交通工具上都不是很好。例如,我不会通过 socket.io 移动大图像或视频,因为有更多专用方法可以做到这一点。因此,socket.io 的使用很大程度上取决于应用程序想要使用它的确切用途。如果您想将视频推送到客户端,您也可以只推送一个 URL,让客户端转身并使用众所周知的高比例技术通过常规 http URL 请求视频。

Redis - 再说一次,在某些事情上很棒,但在所有事情上都不是很好。所以,这真的取决于你想要做什么。我之前解释的是,数据存储的设计和通过它的事务数量可能是你真正的规模问题所在。如果我开始这项工作,我会从了解服务器的数据存储需求、各种类型的每秒事务、缓存策略、冗余、故障转移、数据持久性等开始...并设计高首先扩展对数据的访问。我不能完全确定 redis 是首选。我可能会建议您在项目早期需要一个大型数据库人员作为顾问。

Nginx - 许多大型网站都使用 nginx,因此它无疑是一个很好的工具。它是否完全适合您的工具取决于您的设计。我可能会最后处理这部分,因为它似乎对设计来说不太重要,一旦系统的其余部分布置好,你就可以在这里考虑你需要什么。

Amazon EC2 - 几种可能的选择之一。这些选择很难在苹果与苹果的比较中直接比较。大型系统是用 EC2 构建的,因此那里有概念证明,并且通用架构似乎是合适的匹配。如果您想知道真正的小精灵在哪里,您需要一位在 EC2 上做过大规模工作的顾问。

Amazon S3 - 我个人知道一些非常高存储和带宽的站点使用 S3 来处理视频和图像。它适用于此。

所以......如果以正确的方式使用,这些通常可能是很好的工具。 Redis 将是一个问号,具体取决于实际应用程序的存储需求(您提供了零要求,并且不能选择零要求的数据库)。一个更合理的答案将基于将一组高级需求组合在一起,这些需求分析系统需要能够做什么才能为 1,000,000 人提供服务。这些要求可以与其中一些部分的已知功能进行比较,以开始扩展系统。然后,您必须将一些基准测试放在一起,以便在系统的某些部分上运行一些测试。失败的成功与否很大程度上取决于应用程序的构建方式以及工具的使用方式,以及选择了哪些工具。您可能会使用许多不同类型的工具来成功扩展。哎呀,Facebook 运行在 PHP 上(嗯,一个经过高度修改的定制 PHP,在运行时根本不是典型的 PHP)。

【讨论】:

  • 感谢您澄清上述堆栈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2015-06-07
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多