Insights from Our Experts
Performance testing and optimization on Django REST API
Need of API performance testing and optimization
The role of APIs in web and app development has increased significantly. API has become vital to our connected world. It is the set of tools, protocols, standards and code that binds our digital world together. APIs allow organizations to become more agile, to go mobile, and everything to work together in a streamlined, integrated way. The performance and optimization of APIs is therefore really important. It does not matter how extremely well-built your front-end applications are if the APIs take several seconds to respond. An efficient API should respond within one second.
Performance testing tools
Let us look at some prominent open source performance testing tools for Django REST API
The Apache JMeter application is open source software, designed to test the performance on static and dynamic resources (Webservices (SOAP/REST), Web dynamic languages - PHP, Java, ASP.NET, Files, etc). It can be used to simulate a heavy load of API calls. You can use it to make a graphical analysis of API performance or to test your server/script/object behavior under heavy concurrent load. It is a full multithreading framework that allows concurrent sampling by many threads and simultaneous sampling of different functions by separate thread groups.
SoapUI is an open source, cross-platform testing tool. It can automate functional, regression, compliance and load testing of both SOAP and REST web services. It comes with an easy-to-use graphical interface and supports industry-leading technologies and standards to mock and stimulate behavior of web services. SoapUI creates test cases directly from the web method request and enables organizing test cases in test suites.It also has support for test coverage and requirements management and allows to change test setup depending on target environment.
ApacheBench (ab) is a benchmarking tool that can load test servers by sending an arbitrary number of concurrent requests. It was designed for testing Apache installations.
cURL is a command line tool to send and receive data using various protocols like HTTP, HTTPS, FTP, LDAP etc. It comes by default with most of the Linux distributions. In order to test a REST API using cURL we just need to hit the command for the appropriate HTTP method in Linux.
HTTPie is an open source CLI HTTP client that is a user-friendly cURL alternative that provides a simple http command designed for painless debugging and interaction with HTTP servers, RESTful APIs, and web services.
Wrk is a tool that is similar to traditional Apache Benchmark. Configuration and execution are through a command line tool. It has very few but powerful settings, only the essential to generate HTTP load.wrk has several improvements over the more traditional ab It is multi-threaded, so it makes it much easier to generate higher loads as it is able to take advantage of multi-core processors.wrk is the best tool when your goal is to find what is the maximum load your API can handle.
Vegeta is an open-source command line tool but one that takes a different approach than all the previous ones we’ve seen before. It focuses on making it easy to achieve and sustain a target rate of requests per second. It’s meant to test how a service behaves at X requests per second. This is extremely useful when you have actual data or an estimation of what your peak traffic will be and you want to validate that your API will be able to keep up with it.
Browser API Testing Tools
Optimization of Django REST API
The Django REST framework allows Django developers to build simple yet robust standards-based REST APIs for their applications.
The database is queried once for data in a table (say, Customers), and then, one or more times per ‘customer’ inside a loop to get, say ’customer.name’. This leads to slow response from APIs. This common Django REST framework performance problem can be reduced by implementing eager loading without any major restructuring of the code. It requires use of the underutilized select_related and prefetch_related methods on the Django ORM (and the newer Prefetch object as well) to perform what is called "eager loading".
Many times we call the same queries via APIs to fetch data. If data is not changing rapidly we can cache the QuerySet which is returned by a particular query. Caching systems generates a hash of SQL query and maps them to cached results. So whenever API tries to call the model query sets the cached query sets will be called.
Do not provide entities the way they are structured on the backend, but focus on balancing simplicity and complexity, and scale your API response to only what the user is intending to display. In this case, it helps to have a close relationship with the teams creating the mobile application so as your API can be augmented to their specific needs.
Database access optimization
APIs mainly returns data retrieved from the database and hence speeding up the database access time can bring a noticeable change in APIs response time. Various database access optimization techniques that can be adopted are:
- Retrieve everything at once if you know you will need it
- Don’t retrieve things you don’t need
- Use foreign key values directly