【问题标题】:High Performance Options for Remote services access远程服务访问的高性能选项
【发布时间】:2015-07-20 16:10:07
【问题描述】:

我有一个服务,foo,在机器 A 上运行。我需要从机器 B 访问该服务。一种方法是在 A 上启动一个 Web 服务器并通过 HTTP 进行;在 A 上的 Web 服务器下运行的代码访问 foo 并返回结果。另一种是在A上写socket server;套接字服务器访问服务 foo 并返回结果。

HTTP 连接启动和握手很昂贵;可以编写套接字,但我想避免这种情况。还有哪些其他选项可用于高性能远程调用?

【问题讨论】:

  • 高性能远程调用是什么意思?而且我认为没有一种解决方案适合您的问题。更具体。
  • 我想使用缓存。我不想托管我自己的 Redis/Memcache。我尝试使用 Elasticache。 ElastiCache 只能在 Amazon Cloud 中使用。我的客户在 AWS 之外。有10个客户。所以我想旋转一个 EC2 实例并将一些东西放在 Elasticache 前面。所以默认情况下是像 NGinx 这样的服务器。我能做到的。但后来想如果有更好的东西。我的请求率峰值约为 400 rps。我的应用程序在缓存查找时可以容忍高达 100-200 毫秒的延迟。目前我最终使用 NoSQL DB(发电机)作为我的缓存。

标签: performance architecture


【解决方案1】:

HTTP 只是套接字上的协议。如果您使用 TCP/IP 网络,您将使用套接字。 HTTP 连接启动和握手不是昂贵的部分,TCP 启动才是真正昂贵的部分。

如果您使用 HTTP 1.1,则可以使用持久连接 (Keep-Alive),这大大降低了成本,更接近于保持持久套接字打开的成本。

这完全取决于您是否想要/需要更高级别的协议。使用 HTTP 意味着您将能够做一些事情,例如从更多的客户端使用此服务,同时编写更少的文档(如果您编写自己的协议,则必须记录它)。 HTTP 服务器还支持开箱即用的身份验证、cookie、日志记录等功能。如果您不需要这些功能,那么 HTTP 可能是一种浪费。但我见过几个项目至少不需要这些东西。

【讨论】:

  • 嗯,我听说像 Facebook 这样的公司已经为远程机器服务调用编写了自己的库。许多其他公司已经在套接字之上编写了库。就像雅虎有一个叫做 REPL 的东西。我只是想问一下那里有没有一般用途的东西。
【解决方案2】:

除了@Rob 的答案之外,由于该问题并不精确地指向应用程序或性能边界,因此最好在更广泛的背景下研究可用的选项,即Inter process communication

维基百科页面清楚地列出了可用的选项,这将是一个很好的起点。

【讨论】:

  • 谢谢;但是 IPC 并不是真正涉及跨机器通信的东西。这主要是关于同一机器进程之间的通信。说内存映射文件 - 你需要一台机器才能做到这一点。我正在寻找跨机器通信。 Web 服务、DCOM、RPC、CORBA 等
【解决方案3】:

你打算使用什么技术?让我回答 Java 世界。

如果您的请求率低于 100/秒,您不应该关心优化并使用最通用的解决方案 - HTTP。

像 Netty-HTTP 这样编写良好的异步服务器可以在中等硬件上轻松处理每秒 1000 个请求。

如果您需要更多或资源有限,您可以使用二进制格式。最流行的一种是 Google Protobuf(多语言)+ Netty(Java)。

你应该知道的关于 HTTP 性能的知识:

  • Http 可以使用 Keep-Alive,从而消除每个请求的重新连接成本
  • Http 会为每个请求和响应增加流量开销 - 大约 50-100 个字节。
  • Http 客户端和服务器会消耗额外的 CPU 来解析 HTTP 标头 - 在上述 100 req/sec 之后很明显
  • 选择技术时要小心。即使在 21 世纪,也很难找到编写良好的 HTTP 服务器和客户端。

【讨论】:

  • 我的客户在 .Net 中。我想使用缓存。我不想托管我自己的 Redis/Memcache。我尝试使用 Elasticache。 ElastiCache 只能在 Amazon Cloud 中使用。我的 .Net 客户在 AWS 之外。所以我想旋转一个 EC2 实例并将一些东西放在 Elasticache 前面。所以默认情况下是像 NGinx 这样的服务器。我能做到的。但后来想如果有更好的东西。我的请求率峰值约为 400 rps。我的应用程序在缓存查找时可以容忍高达 100-200 毫秒的延迟。目前我最终使用 NoSQL DB(发电机)作为我的缓存。
  • 看看memcached
  • 是的,我查看了 memcached。当我想避免托管自己的 memcached 并开始关注 ElastiCache 时,整个事情就开始了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2017-04-21
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多