go.uber.org/yarpc@v1.72.1/api/peer/peer.go (about) 1 // Copyright (c) 2022 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package peer 22 23 // ConnectionStatus maintains information about the Peer's connection state 24 type ConnectionStatus int 25 26 const ( 27 // Unavailable indicates the Peer is unavailable for requests 28 Unavailable ConnectionStatus = iota 29 30 // Connecting indicates the Peer is in the process of connecting 31 Connecting 32 33 // Available indicates the Peer is available for requests 34 Available 35 ) 36 37 // Status holds all the information about a peer's state that would be useful to Subscribers 38 type Status struct { 39 // Current number of pending requests on this peer 40 PendingRequestCount int 41 42 // Current status of the Peer's connection 43 ConnectionStatus ConnectionStatus 44 } 45 46 // Identifier is able to uniquely identify a peer (e.g. hostport) 47 type Identifier interface { 48 Identifier() string 49 } 50 51 // StatusPeer captures a concrete peer implementation for a particular 52 // transport, exposing its Identifier and Status. 53 // StatusPeer provides observability without mutability. 54 type StatusPeer interface { 55 Identifier 56 57 // Get the status of the Peer 58 Status() Status 59 } 60 61 // Peer captures a concrete peer implementation for a particular transport, 62 // providing both observability (Identifier and Status), along with load change 63 // notifications (StartRequest) (EndRequest). 64 // Transports reveal peers to peer lists, which in turn offer them to outbounds 65 // when they choose a peer. 66 // Having Start/End request messages allows the outbound to broadcast load 67 // changes to all subscribed load balancers. 68 // The peer should be created by a transport so we can maintain multiple 69 // references to the same peer (e.g., hostport). 70 type Peer interface { 71 StatusPeer 72 73 // Tell the peer that a request is starting 74 StartRequest() 75 76 // Tell the peer that a request has finished 77 EndRequest() 78 }