基于TCP的流报价服务的负载测试–可测试的博客–中

该帖子最初于2016年2月2日发布在我们的Tumblr博客上。在此发布,并进行一些小更新以反映最新的Testable功能。

对基于TCP的报价服务进行负载测试

在金融世界中,有许多可在原始TCP和UDP套接字上运行的自定义协议和对性能敏感的API。 目前,大多数负载测试服务在此领域均未提供任何解决方案,在Testable,我们认为这是使我们与众不同的领域。

在这篇文章中,我们将向您展示如何使用Testable来对使用基于TCP的简单自定义协议的流股票报价服务进行负载测试。 我们将利用S&P 500符号作为测试的一部分,在测试的各个迭代之间平均分配。

流报价服务API

报价服务API可在sample.testable.io:8091上获得

  1. 打开TCP套接字连接到报价服务
  2. 发送格式为“ subscribe | [symbol] \ n”的订阅数据包
  3. 使用以下JSON格式,每个订阅的符号每秒接收一次报价包:
    {“ symbol”:“ [symbol]”,“ price”:87.85,“ exchange”:“ NYSE”} \ n
  4. 要取消订阅,请发送“ unsubscribe | [symbol] \ n”
  5. 关闭TCP套接字

测试概述

我们的测试方案如下:

  1. 连接到报价服务
  2. 订阅从500个潜在符号池中均匀分布的5个符号
  3. 接收更新30秒
  4. 断开报价服务

然后,我们将在以下配置下大规模执行此方案:

  1. 共有50个并发客户分布在2个全球区域(俄勒冈州弗吉尼亚北部)。 选择了号码,以便可以在我们的免费帐户上运行!
  2. 每个客户端将执行上述方案5分钟。

步骤1:创建一个测试用例

确保首先注册可测试帐户。 登录后,单击“ 新建测试用例”按钮,为其命名,然后指定URL(在我们的示例中为tcp://sample.testable.io:8091)。

步骤2:定义测试方案

这里的目标是将上述测试方案转换为可执行代码。 这可以通过创建记录或编写脚本来完成。 在我们的情况下,让我们选择脚本选项

可测试脚本只是在沙盒Node.JS环境中执行的Javascript。

单击“下一步”,然后选择“编写脚本”作为方案类型 。 在编写脚本之前,尽管我们需要上载将用于测试的S&P 500符号。

上载符号CSV

S&P500符号可在此处找到。 继续下载。

展开“ 数据”部分,然后单击“ 添加文件” 。 选择symbol.csv文件。 它将为您提供前10行的预览。 由于我们的CSV只有一列,请随时忽略解析错误。 单击看起来不错! 并且CSV将被上传。

写脚本

现在我们有了符号,是时候编写脚本了! 您可以通过使用模板下拉列表并选择TCP-> TCP连接作为起点来开始使用,但是在这种情况下,我们使用以下代码代替:

  var client = net.connect({主机:'sample.testable.io',端口:8091},function(){ 
dataTable.open('symbols.csv')。next({rows:5},function(row){
client.write('subscribe |'+ row.data ['Symbols'] +'\ n');
});
});

client.on('data',function(data){
_.forEach(data.toString()。split('\ n'),function(packet){
如果(packet.length> 0){
var quote = JSON.parse(packet);
results(quote.symbol).counter('quotesReceived',1);
}
});
});

setTimeout(function(){
client.end();
},30000);

此代码使用Node.js net模块与我们的报价服务进行通信。 让我们逐段浏览代码。

  var client = net.connect({主机:'sample.testable.io',端口:8091},function(){ 

这条线打开到示例服务的TCP套接字连接。

  dataTable.open('symbols.csv')。next({rows:5},function(row){ 

从我们先前上传的CSV文件中获取带有S&P 500符号的下5行。 不用担心,Testable使用全局测试范围的迭代器确保每个并发客户端获得不同的行。 每收到一行,便会调用一次回调函数。

  client.write('subscribe |'+ row.data ['Symbols'] +'\ n'); 

订阅在CSV的“ 符号”列中找到的符号 (即唯一的列!)。 服务器处理完此请求后,我们希望开始以以下格式接收该符号的引号:

  { 
“ symbol”:“ [symbol]”,
“价格”:87.85,
“ exchange”:“ NYSE”
}

让我们继续前进,查看报价处理代码。

  client.on('data',function(data){ 
_.forEach(data.toString()。split('\ n'),function(packet){
如果(packet.length> 0){
var quote = JSON.parse(packet);
results(quote.symbol).counter('quotesReceived',1);
results('所有符号').counter('quotesReceived',1);
}
});
});

这里发生了一些事情:

  1. 订阅TCP套接字上的数据事件。
  2. 收到消息(价格报价)后,请使用换行符将其拆分,以防出现多个更新。
  3. 对于每个引用,将其解析为JSON对象。
  4. 每个符号和一个总的“已收到报价”计数器加1。我们稍后将在分析测试结果时使用这些度量。 请注意,您也可以捕获自定义时间和直方图。
  setTimeout(function(){client.end();},30000); 

最后一部分只需等待30秒,然后合上插座即可。

现在,此代码定义了要大规模执行的方案

按下右上方的“ 冒烟测试”按钮, 测试脚本。 这将在共享的Testable测试运行程序上执行一次。 任何捕获的指标和日志记录将显示在“ 冒烟测试输出”选项卡中。

烟雾测试输出示例

请注意,除了我们在脚本中添加的自定义指标之外,Testable还自动捕获了一系列指标。

步骤3:配置负载测试

单击下一步转到“ 配置”步骤。 现在,我们准确定义了如何执行在步骤2中定义的方案。

  • 每个区域有25个并发客户端。 每个并发客户端代表一个并行连接到报价服务的用户。
  • 5分钟的持续时间。
  • Public Shared Grid测试运行程序中的两个区域(AWS N Virginia和AWS Oregon)。

单击开始测试按钮,您的报价服务负载测试已关闭并正在运行!

步骤4:查看结果

现在,您应该看到结果随着测试执行而流入。 默认仪表板将显示摘要,结果网格以及系统捕获指标的图形。

让我们绘制quotesReceived指标的图表,并将其添加到“摘要和结果”网格。

添加报价收到的图表

在右上角单击三角形按钮,然后选择添加图表

给它起一个类似“收到报价”的名称。 选择一个折线图,让我们对quotesReceived-> count和quotesReceived-> total进行图表。

添加图表,它将显示在您的仪表板上。

添加报价收到摘要

向下滚动到摘要,然后按配置图标。 按添加列并选择接收的公制报价并按更新摘要 。 您可以通过在配置窗口中上下拖动新的列来对列进行重新排序。

更新配置后,摘要将如下所示:

它不仅会显示在摘要中,而且下次您运行测试时,还会显示该指标与上次测试运行相比的百分比变化。

添加引号接收到结果网格

与将其添加到摘要中相同,只是现在我们可以看到符号接收的报价数量。

现在,使用“ 仪表板”将此仪表板另存为新仪表板。->右上角下拉菜单中的“ 另存为 ”。 阅读此内容以获取有关自定义仪表板的更多信息。

就是这样! 我们已经对报价服务进行了负载测试,同时捕获了一些自定义指标,大规模运行它并分析了结果。