Since all the logic components of a solution are essential so that it can offer all the services for which it was designed, the duplication of these components or the virtual components of the solution helps minimize the impact of the dispersion of a solution. A logic component that depends on a single virtual component has only one source providing it with the information required so that it is functional. By duplicating this virtual component, the failure of one of them does not prevent the other from functioning. The more the duplicates of the virtual component are accessible, the less there is risk of the logic component becoming dysfunctional due to the unavailability of one or more duplicates of the virtual component. The availability of information from a virtual component is influenced directly by the number of duplicates allowing access to this information.
In order to access information from duplicates, additional mechanisms must be implemented by the component consuming the duplicates’ information. Directories of component duplicates, component discovery mechanisms, and mechanisms for automatic failover between duplicates are examples. The detail of these implementations is not addressed in the context of this analysis, since it is an integral part of the logic components; it is assumed that these mechanisms are in place and fully functional.
Other mechanisms can be put in place in the same implementation as that of the logic components. For example, asynchronous processing allows a logic component to retry access of a virtual component in case of failure. These mechanisms are integral to the implementation of logic or virtual components and are abstract in the framework of this study.
An additional virtual component is considered a duplicate when the characteristics described in previous sections are met. These characteristics are in addition to the characteristics of the types of virtual components defined in previous sections too.
The framework of this study is limited to the virtual components arising from possible combinations of the characteristics of the IPO model. The analysis is therefore limited to replication of transitional virtual components, processing, and immutability.
Transitional virtual components have no persistent data; replication of such components, while retaining the same input and output, encourages a better availability. It is also possible to establish certain characteristics so that a transitional virtual component is considered a duplicate of another transitional virtual component.
Section A different paradigm describes how a hierarchy of components creates parent-child relationships when one component is dependent on another. While duplicated transitional virtual components are used for redundancy, mechanisms internal to the parent component and, potentially, the child component, must be put in place in order to use a duplicate of this virtual component when there is a failure. In the case where information travels through all the duplicates, the parent and child logic components must synchronize the information received, since the physical implementation of these virtual components is not known and the information may not be received in the same order as it was sent.
The additional characteristics of a duplicate of a transitional virtual component are:
- that the input of each duplicate is connected to the same component as the original; and
- that the output of each duplicate is the same component as the original.
Virtual processing components, such as transitional ones, have no persistent data. A component of this type can therefore be duplicated in the same way as a transitional virtual component.
Conversely, the characteristics added to the basic characteristics of a virtual processing component are not the same as those added to transitional virtual components. For virtual processing components, it is necessary that the processing performed by the duplicate is the same as that achieved by the original, that it is reproducible, and that it does not maintain state, as mentioned in section Transitional Virtual Components. The processing is local to the dependency of the processing, without having access to immutable dependencies.
Immutable virtual components have a characteristic that complicates replication: these are the only virtual components that must maintain a state.
Replication of these components is therefore not possible, unless we determine the component state for all the duplicates. In the case where the original would be missing, its duplicate could then take over as it would have kept the same state. The same mechanism should be put in place and synchronized between all the logic components, whether or not they are included in the software solution being analyzed.
One characteristic stands out: all the duplicates of the virtual component through which the logic component must be able to persist or read the state must do so atomically, at least from the point of view of the logic component consuming the service of these duplicated virtual components. Access to information must be done in such a way that a single component can write, or that more components can read this state of the same immutable virtual component, at a time t. In this way, the state persists for either all duplicates, or for none. Upon its reading, the information should be the same across all duplicates of that component, since the information was made persistent by logic components having the mechanisms allowing it to be atomic, consistent, isolated and durable (ACID). The next section describes limitations.