Dart:Scalable Application Development
上QQ阅读APP看书,第一时间看更新

Load testing

It is good to know the limits of an application long before you ever reach them. The HttpClientRequest function can be used to create requests to the blog server, and the HttpClientResponse function can be used to receive incoming data from the blog server.

The statusCode property will be checked to ensure that the page request was successfully handled by the server.

Building a simple load tool

A simple benchmark for the blog server would be the time taken to serve 1000 files. The getUrl method triggers the actual request with the first then clause, closing the request to the server. The following then clause handles the actual response from the server.

This method can be used to monitor a live website and perhaps trigger a notification if a status other than HttpStatus.OK is received:

import 'dart:io';

main() {
  print("Starting...");

  var url = "http://127.0.0.1:8080/index.html";
  var hc = new HttpClient();
  var watch = new Stopwatch();
  int attemptedRequests = 1000;

  print("Starting testing...");
  watch.start();

  for (int i=0;i<attemptedRequests;i++)
  {
    hc.getUrl(Uri.parse(url))
      .then((HttpClientRequest request) => request.close())
      .then((HttpClientResponse response) {
        if (response.statusCode==HttpStatus.OK)
          print("$i, ${response.statusCode}, ${watch.elapsed.inMilliseconds}");
      });
  }
}

The Stopwatch class can be used to measure the time taken and reported to standard output via a print statement. As the responses arrive asynchronously, the status is printed after each response. The request number, status code, and elapsed time are printed with a comma between each value, so that the data can easily be manipulated in a spreadsheet application.

Try putting a print statement directly after the loop has finished and you will see the print run before the first response is received from the server (or soon after).

On my modest Linux laptop, the server was able to serve index.html 2000 times in 3.8 seconds—not too bad! Try experimenting with the request number; however, you are likely to hit a limit on open files, as this simple benchmark fires many simultaneous requests.