为WCF服务定义SLA

时间:2008-10-15 23:26:50

标签: wcf web-services soa

我必须对一堆相互依赖的服务进行性能/负载测试。它们都使用net.tcp,大多数使用双工合同和内部排队。 [handrolled POCO队列类使用lock(syncRoot){if(queue.Empty)Thread.Wait(); }]

以下是我提出的方法:

  1. 确定要进行性能测试的WCF服务
  2. 确定每项服务的相关性能计数器
  3. 确定将通过正在测试的服务执行的逻辑起点
  4. 使用VS.Net为每项服务自动生成单元测试
  5. 编写特定的功能测试(例如,我可以使用一个用例 - “下订单” - 并编写测试,以便对相关服务进行所有调用,并且通常可以执行所需的所有功能)
  6. 使用运行#5的跟踪文件生成单元测试[使用CodePlex的WCF负载测试](在某种程度上,这似乎是在调试环境中重建生产/字段中的用户错误的理想工具。免责声明:未使用工具。阅读项目的印象desc)
  7. 可以调整上述测试以使用自动生成的输入数据进行调用
  8. 介绍输入的变体,以便执行不同的代码路径
  9. 从性能计数器记录数据
  10. 分析并识别瓶颈
  11. 问题:

    1. 有更好的方法吗?
    2. 如果服务使用内部队列,使用std性能计数器测量性能,这是一个问题。我可能需要自定义计数器吗?
    3. 如果#1为真,有没有办法在不更改被测服务代码的情况下引入客户柜台?
    4. 我应该关心功能测试的结果吗?
    5. 有没有办法[非侵入式]为WCF服务实施SLA? (我想如果我的计数器有足够的数据,例如请求服务,发生异常,响应时间等等,我应该能够验证我的SLA - 在5分钟内提供200,000个请求,每个请求的响应时间为2秒 - 反对这些数字。我的问题或许是我是否可以指定我的SLA,产品/工具可以完成现场背后的所有管道并给我一个表格的答案?我知道......我知道......我白天做梦:))
    6. 旁白:在WCF服务内部对请求进行排队的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

哇......标题绝对是冰山一角!希望我的回答不会偏离此处! :)

  1. WCF服务的性能测试可以通过多种方式完成:使用Microsoft Team Test,Borland Silk Performer,Mercury LoadRunner等测试工具,或类似LoadGen或自定义测试工具。我倾向于尝试采用您在创建某种功能单元测试时所做的方法,然后将数据提供给该测试,同时使用测试工具来启动该测试的多个并发实例(虚拟“用户”) 。大多数商业测试工具的工具确实促进了这种类型的测试,因此在这里很难出错。最大的挑战通常是维护测试用例和测试数据以支持测试应用程序。

  2. WCF没有任何与性能相关的内置计数器。那实际上是一个盲点。当然,您可以看到正在向服务器建立多少连接,但这是粗略的信息,您可能想知道哪些服务正在为这些请求提供服务。有传言称微软的“都柏林”作为为WCF / WF提供丰富托管环境的一部分,将包括为托管服务提供性能计数器。我们将不得不等待,看看究竟发生了什么。

  3. 如果我需要在不影响现有代码库的情况下检测WCF服务,我会查看可以从可以应用于服务的WCF行为中获得多少里程数。此自定义行为可能会显示您可能需要的性能计数器。

  4. 是。我会关心功能测试的结果(意味着性能?)。需要注意的是,可能会有一些启动(JIT)被忽略。我可能会查看功能测试的执行情况以获取执行指标 - 但我不会在性能运行期间启用代码分析。

  5. 对于SLA而言,自定义行为可能就是答案。您可以将操作指标记录到数据库,然后报告。 Amberpoint和SOA Software等商业产品也将为此提供支持(包括性能计数器)。

  6. 将请求排队到wcf服务?我立即想到net.msmq绑定,特别是如果你想让请求持久。