|
|
1.1 ! root 1: % run this through LaTeX with the appropriate wrapper ! 2: ! 3: \chapter {Motivation and Concepts}\label{cook:concepts} ! 4: Remote operations are a well understood technique for building distributed ! 5: applications. ! 6: Currently, ! 7: OSI technology provides a powerful notation for specifying the external ! 8: interactions of these systems. ! 9: Remote operations in OSI are particularly attractive as they specify the ! 10: homogeneous externally visible and verifiable characteristics needed for ! 11: interconnection compatibility, ! 12: while avoiding unnecessary constraints upon and changes to the heterogeneous ! 13: internal design and the implementation of the information processing systems ! 14: to be interconnected. ! 15: Many feel ! 16: that this capability is likely to be a key factor in the overall success of ! 17: OSI standardization. ! 18: ! 19: In \cite{ECMA.ROS}, ! 20: a methodology for remote operations is presented which aims to package this ! 21: technology concisely. ! 22: Although the latter half of this document has been rendered obsolete by more ! 23: recent work in the standards bodies ! 24: (e.g., \cite{ISO.ROS.Service,ISO.ROS.Protocol}) ! 25: The aim of this volume, {\sl The Applications Cookbook}, ! 26: is to provide programming support for this methodology. ! 27: ! 28: \section {A Model for Distributed Applications} ! 29: Remote operations are viewed as part of a methodology for building ! 30: distributed applications.% ! 31: \footnote{This section presents a (hopefully) simplified version of the ! 32: information presented in the first half of \cite{ECMA.ROS}. ! 33: Interested readers should consult this original work for further details.} ! 34: In order to understand the role remote operations play in this programming ! 35: model, ! 36: one other notion must be explained first. ! 37: ! 38: \subsection {Abstract Data Types} ! 39: An {\em abstract data type\/} is a concept for describing a data structure ! 40: which is accessed in a well-defined manner. ! 41: This has several implications: ! 42: \begin{itemize} ! 43: \item Although the data structure may have a {\em concrete representation\/} ! 44: on a given local system (e.g., a {\em C\/} \verb"struct"), ! 45: its corresponding abstract data type is defined in an ! 46: implementation-independent fashion, ! 47: termed its {\em abstract syntax}. ! 48: ! 49: \item A well-defined set of rules, ! 50: defined by an {\em abstract transfer notation}, ! 51: is used to serialize the abstract syntax so that a data structure ! 52: corresponding to the abstract data type may be unambiguously ! 53: transmitted on the network. ! 54: There are actually two mappings here: ! 55: \begin{itemize} ! 56: \item First, the data structure is mapped to the abstract syntax ! 57: for the abstract data type. ! 58: This is an implementation-dependent mapping. ! 59: ! 60: \item Second, the abstract syntax is mapped to the concrete ! 61: syntax. ! 62: This is a serializing activity resulting in a stream of octets ! 63: (although some concrete syntaxes produce bit-aligned, ! 64: rather than octet-aligned, streams). ! 65: Do not confuse the concrete representation described above ! 66: (which deals with programming languages), with the concrete ! 67: syntax (which deals with transmission properties). ! 68: \end{itemize} ! 69: ! 70: \item Access to an abstract data type is defined by a set of unitary actions ! 71: termed {\em operations}, ! 72: which define the complete behavior of an instance of the abstract data ! 73: type. ! 74: ! 75: \item {\em Strong typing\/} results when operations are the only permitted ! 76: means of accessing an abstract data type. ! 77: ! 78: \item An {\em object model\/} for programming follows from the use of ! 79: abstract data types rather than concrete data structures. ! 80: Since operations are used to ultimately manipulate the data structures, ! 81: an important level of indirection has been introduced: ! 82: data structures may be accessed without regard to their actual ! 83: implementation. ! 84: \end{itemize} ! 85: ! 86: \subsection {Operations} ! 87: Having described the relationship between data structures, ! 88: abstract data types, ! 89: and operations, ! 90: consider the generic structure of an operation. ! 91: An {\em operation}, in its most primitive form, ! 92: is a simple request/reply interaction. ! 93: The interaction takes the following form: ! 94: \begin{itemize} ! 95: \item The operation is {\em invoked}. ! 96: An invocation consists of: ! 97: \begin{itemize} ! 98: \item an {\em operation number}, ! 99: which uniquely identifies the operation to be performed; ! 100: ! 101: \item an arbitrarily complex {\em argument\/}; ! 102: ! 103: \item an {\em invocation identifier}, ! 104: which is used to distinguish this invocation from other ! 105: previous invocations; ! 106: and, ! 107: ! 108: \item possibly a {\em linked invocation identifier}, ! 109: which is used to indicate that this invocation results ! 110: during the processing of a previous invocation. ! 111: \end{itemize} ! 112: ! 113: \item If the operation succeeds, then a {\em result\/} may be returned. ! 114: A result consists of: ! 115: \begin{itemize} ! 116: \item an invocation identifier corresponding to the operation ! 117: which succeeded; ! 118: and, ! 119: ! 120: \item (possibly) an arbitrarily complex {\em result}. ! 121: \end{itemize} ! 122: ! 123: \item If the operation fails, then an {\em error\/} is returned. ! 124: An error consists of: ! 125: \begin{itemize} ! 126: \item an invocation identifier corresponding to the operation ! 127: which failed; ! 128: ! 129: \item an {\em error number}, ! 130: which uniquely identifies the error that occurred; ! 131: and, ! 132: ! 133: \item (possibly) an arbitrarily complex {\em parameter}. ! 134: \end{itemize} ! 135: ! 136: \item If the operation was not performed for some reason ! 137: (e.g., an unknown operation number, mistyped arguments for ! 138: the operation, and so on), then a {\em reject\/} is returned. ! 139: A reject consists of: ! 140: \begin{itemize} ! 141: \item an invocation identifier corresponding to the operation ! 142: which was performed ! 143: (in degenerate cases this information may not be available); ! 144: and, ! 145: ! 146: \item a {\em reason}, ! 147: which describes, in general terms, the rejection which ! 148: occurred. ! 149: \end{itemize} ! 150: \end{itemize} ! 151: Note that in all cases, ! 152: operations are seen as being {\em total}. ! 153: This means that for any given operation, ! 154: the normal outcome (the result) ! 155: and all exception outcomes (the errors) are well-defined and mutually ! 156: exclusive (unambiguously distinguished). ! 157: ! 158: \subsection {Associations} ! 159: Thus far, we have implicitly assumed some communications relationship ! 160: (i.e., a {\em binding\/}) between the entity invoking operations, ! 161: the {\em invoker}, ! 162: and the entity performing them, ! 163: {\em performer}. ! 164: It is necessary formalize these notions somewhat. ! 165: ! 166: An {\em association\/} is a binding between two entities, ! 167: which are referred to as ! 168: the {\em initiator\/} and the {\em responder}. ! 169: Although this sounds straight-forward, ! 170: there is actually one level of indirection present: ! 171: the initiator does not directly select a responder for binding, ! 172: but rather selects a {\em service\/} that it wishes to use. ! 173: During this process a responder is located and the binding established. ! 174: ! 175: The binding process is actually two-step: ! 176: first, ! 177: the initiator determines which service it requires and asks to have this ! 178: service mapped onto the entities available on the network; ! 179: second, ! 180: based on the initiator's communications requirements, ! 181: an association will be bound to one of those entities, ! 182: which becomes the responder. ! 183: ! 184: Note that there is no requirement that the initiator of an association be the ! 185: entity which requests operations to be invoked ! 186: (i.e., the initiator need not be an invoker), ! 187: nor that the responder of an association be the entity which performs the ! 188: operations ! 189: (i.e., the responder need not be a performer). ! 190: ! 191: \section {Design Guidelines} ! 192: Although the characteristics of operations will vary between applications, ! 193: there are certain guidelines which should be of universal interest. ! 194: ! 195: \subsection {Reliability Characteristics} ! 196: When executing an operation in a distributed environment, ! 197: there is always an element of uncertainity with regards to the occurrence of ! 198: remote events, ! 199: particularly when failures occur. ! 200: One classification of reliability might be as follows: ! 201: for a given invocation, ! 202: a guarantee is given that it occurs {\em exactly once}, ! 203: {\em at least once}, or {\em at most once}. ! 204: ! 205: The first two guarantees require an end-to-end confirmation, ! 206: with the proviso that the semantics of {\em exactly once\/} require a ! 207: recovery scheme in the event of failures. ! 208: When an operation has the semantics of {\em at least once}, ! 209: it is called {\em idempotent}. ! 210: These are operations which read information, ! 211: but do not modify the remote state. ! 212: ! 213: In practice, ! 214: implementing these semantics can be surprisingly straight-forward, ! 215: given the judicious use of invocation identifiers: ! 216: \begin{describe} ! 217: \item[exactly once:] The invoker repeatedly requests the operation ! 218: (using the same invocation identifier) ! 219: until either a confirmation (result or error) is received ! 220: or a rejection of ``duplicate operation'' is received. ! 221: The performer keeps track of the invocation identifiers of all ! 222: performed operations requested by an entity from an epoch date. ! 223: If the performer finds an invocation identifier being repeated, ! 224: rather than perform the operation, ! 225: it rejects the operation as a ``duplicate operation''. ! 226: ! 227: \item[at least once:] The invoker repeatedly requests the operation ! 228: (with any invocation identifier) ! 229: until a confirmation (result or error) is received. ! 230: The performer has no state information regarding previously used invocation ! 231: identifiers. ! 232: ! 233: \item[at most once:] The invoker requests the operation exactly once with any ! 234: invocation identifier. ! 235: The performer has no state information regarding previously used invocation ! 236: identifiers. ! 237: \end{describe} ! 238: ! 239: \subsection {Keeping Total Operations Total} ! 240: An operation may be thought of as {\em confirmed\/} when either a result or ! 241: error is returned by the performer. ! 242: However, ! 243: under the OSI framework for remote operations, ! 244: it is possible to have an operation which may only return a result, ! 245: or may only return errors. ! 246: This is a subtle point, ! 247: but one worth emphasizing: ! 248: in the past some operations have been defined which on success do not return ! 249: a result, ! 250: this lead to ambiguity in as much as the invoker could not determine the ! 251: ``correct'' time to terminate the association, ! 252: since ``silence'' on the part of the performer could mean that the operation ! 253: completed successfully or that the operation was still in progress and an ! 254: error return might be forthcoming. ! 255: In keeping with the philosophy of total operations, ! 256: it is important to have an operation return a result, ! 257: even if the information is \verb"NULL". ! 258: ! 259: \section {For Further Reading} ! 260: The first half of \cite{ECMA.ROS} is the most authoritative reference on ! 261: using remote operations. ! 262: In particular, Section~4.4 ! 263: presents a simple template methodology for using remote operations. ! 264: As mentioned earlier, ! 265: Section~5 and beyond have been obsoleted by work in ISO and CCITT. ! 266: ! 267: In as much as the standards from these bodies deal with the remote operations ! 268: service and protocol, ! 269: they are not particularly germane here. ! 270: The ISO work on remote operations is presented in ! 271: \cite{ISO.ROS.Service} and \cite{ISO.ROS.Protocol}. ! 272: The corresponding CCITT work is ! 273: described in \cite{CCITT.ROS.Service} and \cite{CCITT.ROS.Protocol}. ! 274: The native interface to these services are discussed in ! 275: Chapter~\ref{librosap} of \volone/.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.