In programming we decompose big things into small, manageable chunks. In algorithms, we solve a small problem, and then use recursion or iteration to solve more complex problems. In software development, we create methods, and interfaces, and classes, and packages with the objective of being more efficient, and letting our code be more maintainable, manageable…so that a change in one part does not require a cascading change in other parts of the application.
Yet, we deploy as a monolith. All the packages run in the same JVM, in the same process. Classic example of this is the Java EE container, where all the wars, jars, and ears are deployed in the same JVM. In this page, I am jotting my notes on micro services, and a high level framework for designing micro services.
An application cannot write directly to the devices, or to the network. It needs to channel the requests via the kernel. Similarly when an application wants to read some data, it performs a read system call. The kernel would load the data into the input buffer, and then someone somehow signals the application that the data is ready to be consumed. While an application, or an application server can be written without understanding what goes under the hood, it is often important to understand the IO subsystem to be able to tune high performing servers. The notes on this page try to concisely capture the key concepts in IO subsystem of an operating system, and prepare a stage for understanding the blocking IO, non-blocking IO, and epoll edge triggered channel selection.Read More