Blog

Learn how to make your apps faster with ETag and Caching. Use the ETag header to detect conflicts.

Labels
AJAX(112) App Studio(7) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(183) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
Monday, May 9, 2022PrintSubscribe
Introduction to Microservices Architecture

This is an excerpt from the upcoming Microservices Workshop.

Rationale

Let's say you want to build an online marketplace. You will need the inventory management system, product catalog, shopping cart, order management system, payment, invoicing, shipping, product reviews, and many other modules. It is tempting to design a unified database that keeps track of everything and build a monolithic app on top. It will likely become a monumental effort. A better approach would be to build the individual modules in the order of their priority.

Use Code On Time to put together an inventory management system. The built-in rich user interface will likely satisfy your needs at least in the beginning. Touch-friendly UI and the ability to run the apps in the native mode (PWA) out of the box will save a tremendous amount of time and money. The built-in RESTful API Engine automatically mirrors the user interface capabilities and is ready to be enabled to serve as the backend of the custom mobile and web applications whenever the moment arrives.

As soon as the MVP (minimal viable product) of the inventory management system is ready, have it deployed.

Create a separate database to keep track of users and roles. Put together a Marketplace Identity application on top of the database with Code On Time. The built-in security system supports the 2-Factor Authentication and optional integration with the external identity providers, such as Google, Microsoft, or Facebook. Deploy the Marketplace Identity application to the server.

Sign into the inventory management system as administrator and configure the Marketplace Identity app as its Cloud Identity Provider. From now on, users signing into the inventory management system will be redirected to confirm their identity with the Marketplace Identity application.

Suppose that the next target is the order management system. Build it to make sure that you can convert the contents of the future shopping cart into a bona fide order. You can add the required tables to the same database schema. Alternatively, set up an entirely new database and make sure that its references to the product inventory are sufficient to keep track of the order-specific information such as SKU, brand, name, and price. The order history becomes isolated from the accidental changes to the product price that would affect the historical orders. Add the membership support to the dedicated database of the order management system.

Sign into the order management system as administrator and configure the Marketplace Identity app as its Cloud Identity Provider.

Continue to build the other modules of the online marketplace. Make them independent and provide each with its own database and membership. Use Code On Time to create the data management screens automatically mirrored in the custom RESTful API of the module. Configure the Marketplace Identity for user authentication.

Use the best-of-the breed frontend libraries and frameworks to put together the product catalog and the shopping cart modules. The RESTful APIs of the modules are authenticated with the access tokens issued by the Marketplace Identity application. Your custom apps will use the OAuth 2.0 protocol to authenticate the users and obtain the tokens.

You will be able to create a cosmos of powerful microservices complete with their RESTful APIs and sophisticated user interfaces for data management. Each microservice is the module that can be evolved and continuously deployed independently.

Custom mobile and web applications will rely on the microservices for their backend functionality. JavaScript-based clients can reference the restful.js script of the identity provider application. The script provides the lightweight wrapper $app.restful on top of the Fetch API. The in parameter in the method argument can specify the name of the module that will respond to the API request.

Only Code On Time makes it possible for a single-man shop or small team of developers to put together applications that rival the software produced by the industry giants! Perfect for prototyping and everyday production use.

Individual microservices can be replaced over time with the custom implementations eliminating any possibility of a technological lock-in.
Monday, May 2, 2022PrintSubscribe
Lesson: ETag and HTTP Caching

RESTful API Engine responses are provided with the ETag header. Browsers automatically submit ETag with the subsequent requests to fetch the same resource. The engine responds with the HTTP status 304 and empty body if the ETag of the resource has not changed. Apps can also submit ETag with CRUD requests for conflict detection.

Detect the data editing conflicts and build high performance applications by taking advantage of the HTTP protocol.
image2.png
The ETag of the resource specified in the If-Match header of the PATCH request allows detecting the data editing conflicts.
image1.png
The items of the Supplier Company Name and CategoryName lookups are fetched from the RESTful Application with GET requests. The physical data transfer happens one time only for each lookup for each subsequent opening of the Edit Product form.
Firefox Developer Tools provide a complete list of HTTP requests executed by the web application. Other browsers may not provide the full picture of the network traffic between the client and the server.
The RESTful Application responds to the lookup requests with the HTTP status code 304. It tells the client that the ETag of the corresponding resource is unchanged and the previously fetched copy of the response can be used instead.

This tutorial is part of the RESTful Workshop designed to empower individual developers and teams to create amazing enterprise-quality backends for mobile and web applications. Zero experience and no code is required to provide your data with the REST API conforming to the Level 3 of Richardson Maturity Model with the built-in OAuth 2.0 and Open ID Connect.

Thursday, April 28, 2022PrintSubscribe
Universal Data Caching

The app responsiveness drives the user satisfaction. The common bottleneck in achieving the quick response time is the backend application of the client app. Network requests and their processing by the backend are inherently slow.

Solution

Developers constantly look for ways to improve the performance of the server code when executing the database queries. Indexes, query hints, and beefier database servers can help a lot.

The best technique is to avoid “talking” to the database at any cost!

The Data Aquarium Framework in the foundation of applications created with Code On Time implements the controller-level caching. Developers identify the information that does not change frequently and specify the caching rules in ~/app/touch-settings.json configuration file.

Consider the following changes in the configuration of the backend application introduced in the RESTful Workshop. The server.cache.rules key defines the caching rules that will make the framework to reuse the previously constructed responses to the requests fetching the Categories and Suppliers data.

JSON
12345678910{
  "server": {
    "cache": {
      "rules": {
        "suppliers|categories": {
          "duration": 1
        }
      }
    }
}

The responses to the requests to fetch data will be placed in the server cache and will stay there for 1 minute. The framework looks up the previous response to a request in the cache. It performs the database queries only if the response is not found. The cache manager removes the stale responses automatically.

The names of the caching rules are the case-insensitive regular expressions evaluated against the data controller names. In this instance the single rule suppliers|categories covers both controllers. The duration property specifies the number of minutes the data will remain in the “cached” state. Set the duration to 1440 to keep the responses in the cache for 24 hours.

Let’s evaluate the impact of the universal caching by invoking repeatedly the Refresh command in the list suppliers of the backend application.

The "Refresh" option in the view selectors will fetch the fresh 
 data from the server. Refreshing requires a single roundtrip.
The "Refresh" option in the view selectors will fetch the fresh data from the server. Refreshing requires a single roundtrip.

The network monitor shows the first five Refresh requests taking between 11 and 20 milliseconds. The request #6 was performed when the caching rules were entered in touch-settings.json configuration file. The remaining requests show the consistent response time of 5 milliseconds. Caching provides a 70% improvement in the average response time in this particular application.

Chrome Developer Tools show the response time to the requests refreshing the list of suppliers.
Chrome Developer Tools show the response time to the requests refreshing the list of suppliers.

Numerous conditions will impact the performance of the database queries. For example, the response will take longer to produce if the database is on the remote server, the server is under heavy load, or the query is complex.

The cached responses will always have a consistent response time.

The categories and suppliers of the products are changed infrequently and are the perfect candidates for caching. The product inventory is changing frequently and shall not be cached.

Do not use caching with the data that cannot be reused. For example, the list of orders of a customer is unique. Its caching is not likely to improve the overall performance.

The cached response must not depend on the user identity or include the user-specific data.

Exemptions

Caching of the lookup data improves performance but introduces the unique challenge. How does one go about making changes to the cached data items? For example, backend administrators will have a hard time while entering the new suppliers or editing the existing ones. The frontend will keep presenting the “unchanged” information. It will take at least a minute for an application to start displaying the new data with the caching configuration presented above.

Caching rules can be enhanced with the exemptRoles and exemptScopes keys specifying the user roles or OAuth 2.0 scopes that are not affected by caching.

JSON
123456789101112{
  "server": {
    "cache": {
      "rules": {
        "suppliers|categories": {
          "duration": 1,
          "exemptRoles": "Administrators",
          "exemptScopes": "inventory.write"
        }
      }
    }
}

Multiple roles are separated with commas while multiple scopes are separated with spaces.

Caching lookup is not performed if the user identity matches either exemptRoles or exemptScopes.

Administrators will not feel the improved performance associated with caching since they are exempt from having their own requests to fetch suppliers and categories to undergo the “caching” treatment. On the other hand they will likely be the only users physically reading and writing the data that is retrieved from the cache for everybody else. Making edits to the data will have a familiar flow.

Labels: Caching
Continue to My Second Post