Platform SDK: Active Directory, ADSI, and Directory Services |
Version skew occurs when applications read the same objects from different replicas before a change has replicated. Applications reading the remote replica see the unchanged object. Version skew is an issue when a given application or set of applications use the information in the directory to interoperate.
For example, an RPC Service can publish its endpoints in the directory using standard RPC APIs (such as RpcNsBindingExport). Clients connect to the service by looking up the desired endpoint in the directory (RpcNsBindingLookupBegin, RpcNsBindingLookupNext, and so on) and binding to it.
Assume that an RPC Service S1 publishes endpoint Es1 and subsequently moves to a different computer. The original endpoint Es1 is changed to Es2, reflecting the new computer's address. Clients reading remote replicas of the directory service are unable to connect to the service until the updated endpoint is replicated. However, moving a service from one computer to another is a rare occurrence; therefore, this interruption/delay should rarely be encountered, especially if the movement of the service is well planned.
In general, partial update occurs when one application is reading a set of data while another application is writing to that same set of data. This is a situation that can occur with any application in a multi-mastered system. There are many ways this can occur. You could have n applications writing to the same data set at once. If you look at it this way, the directory replication service is just another application that could potentially be writing to the same data set that another application may be reading. This could be a potential problem for an application. However, the window of time in which a partial update can affect your application is relatively small. This should rarely if ever be an issue for applications that are not dependent on the synchronization of multiple objects. If your application is highly dependent on the synchronization of a related set of objects, you should consider the effects of a partial update in your application design.
In terms of the directory replication, partial update occurs when applications read the same set of objects from different replicas while replication is in progress. Applications at the remote replica see some of the changes but not all.
Note that the window in which partial update can affect an application is small: the application must start reading objects while inbound replication is in progress, after one or more of the related, changed objects have been received but before all have been received. The time between the updates at the source replica directly affects the size of this window — updates that occur close together in time will be replicated close together in time. Partial update can be an issue when an application uses a related set of objects.
For example, a remote access service can use the directory to store policy and profile information. The policy information is stored in one set of objects, and the profile in another set. When a user connects to the remote access service, the remote access service reads the policy to determine whether the user is allowed to connect, and if so what profile to apply to the user's session. Partial update can affect the remote access service in several ways:
Collisions occur when the same attributes of two or more replicas of a given object are changed during the same replication interval. The replication process reconciles the collision; because of reconciliation a user or application may "see" a value other than the one they wrote.
A simple example is user address information: A user changes a mailing address at replica R1 and an administrator changes the same mailing address at replica R2. A written value propagates until another value is selected over that value by the collision reconciliation mechanism. As long as a value continues to "win" against other values in the collision resolution process, the value continues to propagate. Ultimately, this "winning" value will be propagated to R1,R2, and all other replicas if no other changes are made.
Collision resolution is an issue for applications that make assumptions about the internal consistency of objects or sets of objects. For example, a network bandwidth allocation management service stores network bandwidth information for a given network segment in the directory in an object O1. The object contains the bandwidth available in bits-per-second and the maximum bandwidth any single user can reserve. The service expects that the user reservable bandwidth will always be less than or equal to the bandwidth available.
Assuming the attributes in question have equal version numbers when the updates occur, there is a small but real possibility that the object will end up with a maximum bandwidth of 64k and a user reservable maximum of 1 million — if the application performs the updates as separate write operations. The application should always update both properties in a single operation.