如何在阴影networking上播放stream量?

对不起,如果这是一个新问题…

我听说过Netflix的故事,Twitter能够在两个不同的基础设施之间复制networkingstream量:一个是权威/可信的,可以回溯到用户; 另一个是“影子”或testing基础设施,认为它正在返回给用户,但没有。 重点是在实际负载和时间testing辅助基础设施。

我很确定这里有一个词来形容,但是“桥梁”似乎不是正确的,也不是“重放”。

任何人都可以帮助我使用这种技术和/或什么工具可以用来完成这个?

我想我应该补充一点,我已经听说过有效的“重放日志”的技术,但真正难以获得真正的速度/分布。

而且,我们不是要validation输出的“正确性”,而是确保我们在新的基础架构中看不到错误/堆栈跟踪/等等。

我个人称之为“通过会话重放进行负载testing”。 对于这种testing技术,我不知道任何简单的通用术语。

我所见过的用于这种负载testing的基本策略是从生产系统中提取日志文件并在testing系统上重播它们。

您可以使用JMeter或Apache Bench等工具来重放来自日志文件的请求。 如果你正在考虑重复非常复杂的客户端/服务器交互(基于原始日志stream的具体时间细节),希望真正运用你的应用程序的内部(寻找竞争条件,定时相关的错误等),你可能会请看编写特定应用程序的testing工具,以大规模模拟客户端。

你不能简单地捕获原始networkingstream量,并用任何基于TCP或IP的协议“重放”它。 TCP序列号不会匹配原始捕获的stream量,也不会工作。 IP层捕获将是有问题的,因为您的模拟客户端将需要回答捕获的发件人的IP地址。 你最好把stream量接近第7层,并使用它来重放会话,否则,你也在编写一个TCP模拟器。 (我可以想象使用诸如tshark来从TCPstream中tshark第7层的数据和时间,并重播这些数据和时间)。

只需重播networkingstream量即可模拟负载,但不一定会捕获缺陷。 您的模拟客户端需要接收来自testing服务器的响应并parsing它们的正确性,如果您想要负载testing应用程序正确响应的任何testing。 由于您的应用程序将生成dynamic响应数据,因此仿真客户端不太可能将testing服务器的响应与生产服务器logging的响应进行比较。 这就是你要编写一个特定于你的应用程序和输出的testing工具的地方。

你使用像BrowserMob这样的服务模拟很多人同时访问你的网站。 这些服务不会重播logging的stream量,因为那样会丢失对话的客户端。 例如,您的服务器将试图发送数据包到互联网上的电脑,不希望接收它们。 但是这些公司所做的是研究日志(通常在应用程序级别而不是数据包级别),并使用该信息来确定人们点击哪些页面,多长时间以及以何种顺序。 这些数据用于编写BrowserMob然后重复的脚本/macros。

正如其他用户所提到的,ApacheBench目前并没有真正使用太多。 10年前,当你需要弄清楚一个静态的HTML文档或者JPEG在一个很重的负载下能够多快地传输的时候,这个function就更有用了。 这不像一堆人点击重新加载,重新加载,在他们的Web浏览器上重新加载一遍又一遍。 testing具有更复杂工作stream程的Web应用程序时,您需要更智能一些。

我不认为你可以在networking层做到这一点,尽pipe你可能会得到一个专门的硬件负载平衡器的内核来处理第二台服务器。 基本上,networkingstream量(TCP)将需要确认发送/接收的每个数据包。 所以如果一个用户发送一个数据包到你的networking,它将被复制到你的prodnetworking和你的影子networking。 每个networking中的服务器都会回复,而且prod服务器的数据包会被转发回到您的机器上,这个机器会回复一个确认,然后他们愉快地进行对话。 但是,如果放弃影子服务器的数据包,则不会看到确认。 所以,它会尝试重新发送,同时减慢所有networking活动的传输速度(这就是所谓的窗口化)。 它将不断重试发送,直到超时,会话被拆除。 老实说,你甚至不能完成一个握手来build立一个连接。

关于最接近你可能会来这将转发原始同步数据包到您的影子服务器,然后将这些框的默认网关设置为一些不存在的位置。 然后,任何时候用户会尝试build立一个连接,他们会得到一个真正的服务器在您的prodnetworking,至less你会发送一个SYN数据包到影子networking。 该死,现在你有我想知道你怎么能做这个工作:)

在Netflix聚会上,我可以问@adrianco 。

答案是,他们编写了自己的工具,它基本上是一个ServletFilter(对不起,Java特定的术语),它重新创build当前的请求,并在目标服务器上执行asynchronous“即发即忘”调用。

好处是:

  • 针对您的testing(“黑暗”)基础架构的“真实世界”stream量模式
  • 不需要logging然后重播

缺点:

  • 在生产箱上有线程/ CPU周期
  • testing基础架构上的延迟可能会备份并影响您的产品盒