Esempio n. 1
0
        public ArraySegment <byte> PrepareFrame(ArraySegment <byte> payload, int length, bool isCompleted, bool headerSent, WebSocketMessageType type, WebSocketExtensionFlags extensionFlags)
        {
            var mask = 0U;

            if (this.maskData)
            {
                mask = unchecked ((uint)ThreadStaticRandom.NextNotZero());
            }

            var header = WebSocketFrameHeader.Create(length, isCompleted, headerSent, mask, (WebSocketFrameOption)type, extensionFlags);

            if (header.WriteTo(payload.Array, payload.Offset - header.HeaderLength) != header.HeaderLength)
            {
                throw new WebSocketException("Wrong frame header written.");
            }

            if (this.log.IsDebugEnabled)
            {
                this.log.Debug($"({this.GetHashCode():X}) [FRAME->] {header}");
            }

            header.EncodeBytes(payload.Array, payload.Offset, length);

            return(new ArraySegment <byte>(payload.Array, payload.Offset - header.HeaderLength, length + header.HeaderLength));
        }
Esempio n. 2
0
        // methods
        /// <inheritdoc/>
        public IEnumerable <ServerDescription> SelectServers(ClusterDescription cluster, IEnumerable <ServerDescription> servers)
        {
            var list = servers.ToList();

            switch (list.Count)
            {
            case 0:
            case 1:
                return(list);

            default:
            {
                // Follow the "Power of Two Choices" approach
                // https://web.archive.org/web/20191212194243/https://www.nginx.com/blog/nginx-power-of-two-choices-load-balancing-algorithm/
                var index1 = ThreadStaticRandom.Next(list.Count);
                var index2 = (index1 + 1 + ThreadStaticRandom.Next(list.Count - 1)) % list.Count;

                var endpoint1 = list[index1].EndPoint;
                var endpoint2 = list[index2].EndPoint;
                var server1   = _clusterableServers.First(s => EndPointHelper.Equals(s.Description.EndPoint, endpoint1));
                var server2   = _clusterableServers.First(s => EndPointHelper.Equals(s.Description.EndPoint, endpoint2));

                var selectedServer = server1.OutstandingOperationsCount < server2.OutstandingOperationsCount ? server1 : server2;

                return(new[] { selectedServer.Description });
            }
            }
        }
        private PooledConnection ChooseAvailableConnection()
        {
            // if the pool is not full return null (so a new connection will be created)
            if (_connections.Count < _settings.MaxConnections)
            {
                return(null);
            }

            // distribute load randomly among the connections
            var index = ThreadStaticRandom.Next(_connections.Count);

            return(_connections[index]);
        }
Esempio n. 4
0
        // methods
        /// <inheritdoc/>
        public IEnumerable <ServerDescription> SelectServers(ClusterDescription cluster, IEnumerable <ServerDescription> servers)
        {
            var list = servers.ToList();

            switch (list.Count)
            {
            case 0:
            case 1:
                return(list);

            default:
                var index = ThreadStaticRandom.Next(list.Count);
                return(new[] { list[index] });
            }
        }
Esempio n. 5
0
 public Random() : this(ThreadStaticRandom.Next())
 {
 }