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); }
protected IObservable <string> BtStreamSubscribe(ZmqPubSubEndpointConfig config) { return(messageBus.Listen <BtStreamMessage>() .Where(x => x.Topic == config.Topic) .Select(x => x.Payload) .Publish() .RefCount()); }
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()); }
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); }
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()); }
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()); }