Example #1
0
        private static ZSocket SetupSubSocket(ZmqPubSubEndpointConfig relay, bool silent = false)
        {
            var subSocket = new ZSocket(ZSocketType.SUB);

            if (!string.IsNullOrEmpty(relay.SharedEncryptionKey))
            {
                subSocket.SetupCurveTlsClient(relay.SharedEncryptionKey, logger);
            }

            subSocket.Connect(relay.Url);
            subSocket.SubscribeAll();

            if (!silent)
            {
                if (subSocket.CurveServerKey != null && subSocket.CurveServerKey.Any(x => x != 0))
                {
                    logger.Info($"Monitoring Bt-Stream source {relay.Url} using Curve public-key {subSocket.CurveServerKey.ToHexString()}");
                }
                else
                {
                    logger.Info($"Monitoring Bt-Stream source {relay.Url}");
                }
            }

            return(subSocket);
        }
Example #2
0
 protected IObservable <string> BtStreamSubscribe(ZmqPubSubEndpointConfig config)
 {
     return(messageBus.Listen <BtStreamMessage>()
            .Where(x => x.Topic == config.Topic)
            .Select(x => x.Payload)
            .Publish()
            .RefCount());
 }
Example #3
0
 protected IObservable <string> BtStreamSubscribe(ZmqPubSubEndpointConfig config)
 {
     return(messageBus.Listen <BtStreamMessage>()
            .Where(x => x.Topic == config.Topic)
            .DoSafe(x => messageBus.SendMessage(new TelemetryEvent(
                                                    clusterConfig.ClusterName, poolConfig.Id, TelemetryCategory.BtStream, x.Received - x.Sent)), logger)
            .Select(x => x.Payload)
            .Publish()
            .RefCount());
 }
Example #4
0
        private static ZSocket SetupSubSocket(ZmqPubSubEndpointConfig relay)
        {
            var subSocket = new ZSocket(ZSocketType.SUB);

            subSocket.SetupCurveTlsClient(relay.SharedEncryptionKey, logger);
            subSocket.Connect(relay.Url);
            subSocket.SubscribeAll();

            if (subSocket.CurveServerKey != null)
            {
                logger.Info($"Monitoring Bt-Stream source {relay.Url} using Curve public-key {subSocket.CurveServerKey.ToHexString()}");
            }
            else
            {
                logger.Info($"Monitoring Bt-Stream source {relay.Url}");
            }

            return(subSocket);
        }
Example #5
0
        protected IObservable <string> BtStreamSubscribe(ZmqPubSubEndpointConfig config)
        {
            return(Observable.Defer(() => Observable.Create <string>(obs =>
            {
                var tcs = new CancellationTokenSource();

                Task.Factory.StartNew(() =>
                {
                    using (tcs)
                    {
                        while (!tcs.IsCancellationRequested)
                        {
                            try
                            {
                                using (var subSocket = new ZSocket(ZSocketType.SUB))
                                {
                                    //subSocket.Options.ReceiveHighWatermark = 1000;
                                    subSocket.ReceiveTimeout = btStreamReceiveTimeout;
                                    subSocket.Connect(config.Url);
                                    subSocket.Subscribe(config.Topic);

                                    logger.Debug($"Subscribed to {config.Url}/{config.Topic}");

                                    while (!tcs.IsCancellationRequested)
                                    {
                                        string topic;
                                        uint flags;
                                        byte[] data;
                                        long timestamp;

                                        using (var msg = subSocket.ReceiveMessage(out var zerror))
                                        {
                                            if (zerror != null && !zerror.Equals(ZError.None))
                                            {
                                                logger.Warn(() => $"Timeout receiving message from {config.Url}. Reconnecting ...");
                                                break;
                                            }

                                            // extract frames
                                            topic = msg[0].ToString(Encoding.UTF8);
                                            flags = msg[1].ReadUInt32();
                                            data = msg[2].Read();
                                            timestamp = msg[3].ReadInt64();
                                        }

                                        // TMP FIX
                                        if (flags != 0 && (flags & 1) == 0)
                                        {
                                            flags = BitConverter.ToUInt32(BitConverter.GetBytes(flags).ToReverseArray());
                                        }

                                        // compressed
                                        if ((flags & 1) == 1)
                                        {
                                            using (var stm = new MemoryStream(data))
                                            {
                                                using (var stmOut = new MemoryStream())
                                                {
                                                    using (var ds = new DeflateStream(stm, CompressionMode.Decompress))
                                                    {
                                                        ds.CopyTo(stmOut);
                                                    }

                                                    data = stmOut.ToArray();
                                                }
                                            }
                                        }

                                        // convert
                                        var json = Encoding.UTF8.GetString(data);

                                        // publish
                                        obs.OnNext(json);

                                        // telemetry
                                        //messageBus.SendMessage(new TelemetryEvent(clusterConfig.ClusterName ?? poolConfig.PoolName, poolConfig.Id,
                                        //    TelemetryCategory.BtStream, DateTime.UtcNow - DateTimeOffset.FromUnixTimeSeconds(timestamp)));
                                    }
                                }
                            }

                            catch (Exception ex)
                            {
                                logger.Error(ex);
                            }

                            // do not consume all CPU cycles in case of a long lasting error condition
                            Thread.Sleep(1000);
                        }
                    }
                }, tcs.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

                return Disposable.Create(() => { tcs.Cancel(); });
            }))
                   .Publish()
                   .RefCount());
        }
Example #6
0
        protected IObservable <string> BtStreamSubscribe(ZmqPubSubEndpointConfig config)
        {
            return(Observable.Defer(() => Observable.Create <string>(obs =>
            {
                var tcs = new CancellationTokenSource();

                Task.Factory.StartNew(() =>
                {
                    using (tcs)
                    {
                        while (!tcs.IsCancellationRequested)
                        {
                            try
                            {
                                using (var subSocket = new SubscriberSocket())
                                {
                                    //subSocket.Options.ReceiveHighWatermark = 1000;
                                    subSocket.Connect(config.Url);
                                    subSocket.Subscribe(config.Topic);

                                    logger.Debug($"Subscribed to {config.Url}/{config.Topic}");

                                    while (!tcs.IsCancellationRequested)
                                    {
                                        var msg = (NetMQMessage)null;

                                        if (!subSocket.TryReceiveMultipartMessage(btStreamReceiveTimeout, ref msg, 4))
                                        {
                                            logger.Warn(() => $"Timeout receiving message from {config.Url}. Reconnecting ...");
                                            break;
                                        }

                                        // extract frames
                                        var topic = msg.Pop().ConvertToString(Encoding.UTF8);
                                        var flags = msg.Pop().ConvertToInt32();
                                        var data = msg.Pop().ToByteArray();
                                        var timestamp = msg.Pop().ConvertToInt64();

                                        // compressed
                                        if ((flags & 1) == 1)
                                        {
                                            using (var stm = new MemoryStream(data))
                                            {
                                                using (var stmOut = new MemoryStream())
                                                {
                                                    using (var ds = new DeflateStream(stm, CompressionMode.Decompress))
                                                    {
                                                        ds.CopyTo(stmOut);
                                                    }

                                                    data = stmOut.ToArray();
                                                }
                                            }
                                        }

                                        // convert
                                        var json = Encoding.UTF8.GetString(data);

                                        // publish
                                        obs.OnNext(json);

                                        // telemetry
                                        messageBus.SendMessage(new TelemetryEvent(clusterConfig.ClusterName ?? poolConfig.PoolName, poolConfig.Id,
                                                                                  TelemetryCategory.BtStream, DateTime.UtcNow - DateTimeOffset.FromUnixTimeSeconds(timestamp)));
                                    }
                                }
                            }

                            catch (Exception ex)
                            {
                                logger.Error(ex);
                            }

                            // do not consume all CPU cycles in case of a long lasting error condition
                            Thread.Sleep(1000);
                        }
                    }
                }, tcs.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

                return Disposable.Create(() => { tcs.Cancel(); });
            }))
                   .Publish()
                   .RefCount());
        }