Represents a message to the scaleout backplane
        public void OnReceived(int streamIndex, ulong id, ScaleoutMessage message)
        {
            _receive(streamIndex, id, message);

            // We assume if a message has come in then the stream is open
            Open(streamIndex);
        }
 // Send messages from the server to the backplane
 protected override Task Send(int streamIndex, IList<Message> messages) {
     return Task.Factory.StartNew(() => {
         var bytes = new ScaleoutMessage(messages).ToBytes();
         var filePath = BasePath + "\\" + DateTime.Now.Ticks + ".txt";
         File.WriteAllBytes(filePath, bytes);
     });
 }
 public RabbitMqMessageWrapper( IList<Message> messages)
 {
     if (messages == null)
     {
         throw new ArgumentNullException("messages");
     }
     ScaleoutMessage = new ScaleoutMessage(messages);
 }
 protected override Task Send(int streamIndex, IList<Message> messages)
 {
     return Task.Factory.StartNew(() =>
         {
             ScaleoutMessage msg = new ScaleoutMessage(messages);
             Bus.Send<DistributeMessages>(m => { m.Payload = msg.ToBytes(); m.StreamIndex = streamIndex; });
         });
 }
 public RabbitMqMessageWrapper(ulong messageIdentifier, IList<Message> messages)
 {
     if(messages == null)
     {
         throw new ArgumentNullException("messages");
     }
     Id = messageIdentifier;
     ScaleoutMessage = new ScaleoutMessage(messages);
 }
        public static string ToScaleoutString(this IList<Message> messages)
        {
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }

            var message = new ScaleoutMessage(messages);
            return Convert.ToBase64String(message.ToBytes());
        }
Example #7
0
        protected override Task Send(int streamIndex, IList<Message> messages)
        {
            var message = new ScaleoutMessage(messages);

            OnReceived(streamIndex, _id, message);

            _id++;

            return TaskAsyncHelper.Empty;
        }
        public static Stream ToStream(IList<Message> messages)
        {
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }

            var scaleoutMessage = new ScaleoutMessage(messages);
            return new MemoryStream(scaleoutMessage.ToBytes());
        }
Example #9
0
        public static byte[] ToBytes(IList<Message> messages)
        {
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }

            var message = new ScaleoutMessage(messages);
            return message.ToBytes();
        }
Example #10
0
        private void TraceScaleoutMessages(ulong id, ScaleoutMessage scaleoutMessage)
        {
            if (!_trace.Switch.ShouldTrace(TraceEventType.Verbose))
            {
                return;
            }

            foreach (var message in scaleoutMessage.Messages)
            {
                _trace.TraceVerbose("Received message {0}: '{1}' over ScaleoutMessageBus", id, message.GetString());
            }
        }
Example #11
0
        public static byte[] ToBytes(IList<Message> messages)
        {
            using (var ms = new MemoryStream())
            {
                var binaryWriter = new BinaryWriter(ms);

                var scaleoutMessage = new ScaleoutMessage(messages);
                var buffer = scaleoutMessage.ToBytes();

                binaryWriter.Write(buffer.Length);
                binaryWriter.Write(buffer);

                return ms.ToArray();
            }
        }
        void FromBytesToBytesProducesCorrectValues()
        {
            var message = new Message("source", "key", "value");
            var message2 = new Message("string", "more", "str");
            var message3 = new Message("s", "l", "n");
            var scaleoutMessage = new ScaleoutMessage(new List<Message>() { message, message2, message3 });

            var bytes = scaleoutMessage.ToBytes();
            var msg = ScaleoutMessage.FromBytes(bytes);

            Assert.True(scaleoutMessage.Messages.Count == 3);
            Assert.True(scaleoutMessage.Messages[0].Source == msg.Messages[0].Source, "Source is not the same");
            Assert.True(scaleoutMessage.Messages[0].Key == msg.Messages[0].Key, "Key is not the same");
            Assert.True(scaleoutMessage.Messages[0].GetString() == msg.Messages[0].GetString(), "Value is not the same");
        }
        public ScaleoutMapping(ulong id, ScaleoutMessage message, IList<LocalEventKeyInfo> localKeyInfo)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (localKeyInfo == null)
            {
                throw new ArgumentNullException("localKeyInfo");
            }

            Id = id;
            LocalKeyInfo = localKeyInfo;
            ServerCreationTime = message.ServerCreationTime;
        }
        public ScaleoutMapping(ulong id, ScaleoutMessage message, IList <LocalEventKeyInfo> localKeyInfo)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (localKeyInfo == null)
            {
                throw new ArgumentNullException("localKeyInfo");
            }

            Id                 = id;
            LocalKeyInfo       = localKeyInfo;
            ServerCreationTime = message.ServerCreationTime;
        }
Example #15
0
        private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage)
        {
            Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count);

            _trace.TraceInformation("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count);
            TraceScaleoutMessages(id, scaleoutMessage);

            var localMapping = new LocalEventKeyInfo[scaleoutMessage.Messages.Count];
            var keys         = new HashSet <string>();

            for (var i = 0; i < scaleoutMessage.Messages.Count; ++i)
            {
                Message message = scaleoutMessage.Messages[i];

                // Remember where this message came from
                message.MappingId   = id;
                message.StreamIndex = streamIndex;

                keys.Add(message.Key);
                ulong localId = Save(message);

                _trace.TraceVerbose("Message id: {0}, stream : {1}, eventKey: '{2}' saved with local id: {3}",
                                    id, streamIndex, message.Key, localId);

                MessageStore <Message> messageStore = Topics[message.Key].Store;

                localMapping[i] = new LocalEventKeyInfo(message.Key, localId, messageStore);
            }

            // Get the stream for this payload
            ScaleoutMappingStore store = StreamManager.Streams[streamIndex];

            // Publish only after we've setup the mapping fully
            store.Add(id, scaleoutMessage, localMapping);

            if (_trace.Switch.ShouldTrace(TraceEventType.Verbose))
            {
                _trace.TraceVerbose("Scheduling eventkeys: {0}", string.Join(",", keys));
            }

            // Schedule after we're done
            foreach (var eventKey in keys)
            {
                ScheduleEvent(eventKey);
            }
        }
        protected override Task Send(int streamIndex, IList<Message> messages)
        {
            return Task.Run(() =>
            {
                var scaleoutMsg = new ScaleoutMessage(messages);

                var msg = new RmqMessage
                {
                    StreamIndex = streamIndex,
                    Id = 0,
                    Body = scaleoutMsg.ToBytes()
                };

                var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(msg));

                model.BasicPublish("messages", "", true, new BasicProperties(), body);
            });
        }
Example #17
0
        public static byte[] ToBytes(IList<Message> messages)
        {
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }

            using (var ms = new MemoryStream())
            {
                var binaryWriter = new BinaryWriter(ms);

                var scaleoutMessage = new ScaleoutMessage(messages);
                var buffer = scaleoutMessage.ToBytes();

                binaryWriter.Write(buffer.Length);
                binaryWriter.Write(buffer);

                return ms.ToArray();
            }
        }
Example #18
0
        private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage)
        {
            Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count);

            _trace.TraceInformation("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count);

            var localMapping = new Dictionary <string, IList <LocalEventKeyInfo> >(StringComparer.OrdinalIgnoreCase);

            for (var i = 0; i < scaleoutMessage.Messages.Count; ++i)
            {
                Message message = scaleoutMessage.Messages[i];

                // Remember where this message came from
                message.MappingId   = id;
                message.StreamIndex = streamIndex;

                IList <LocalEventKeyInfo> keyInfo;
                if (!localMapping.TryGetValue(message.Key, out keyInfo))
                {
                    keyInfo = new List <LocalEventKeyInfo>();
                    localMapping.Add(message.Key, keyInfo);
                }

                ulong localId = Save(message);
                MessageStore <Message> messageStore = Topics[message.Key].Store;

                keyInfo.Add(new LocalEventKeyInfo(localId, messageStore));
            }

            // Get the stream for this payload
            ScaleoutMappingStore store = StreamManager.Streams[streamIndex];

            // Publish only after we've setup the mapping fully
            store.Add(id, scaleoutMessage, localMapping);

            // Schedule after we're done
            foreach (var eventKey in localMapping.Keys)
            {
                ScheduleEvent(eventKey);
            }
        }
Example #19
0
        public static ScaleoutMessage FromBytes(byte[] data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            using (var stream = new MemoryStream(data))
            {
                var binaryReader = new BinaryReader(stream);
                var message      = new ScaleoutMessage();
                message.Messages = new List <Message>();
                int count = binaryReader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    message.Messages.Add(Message.ReadFrom(stream));
                }
                message.ServerCreationTime = new DateTime(binaryReader.ReadInt64());

                return(message);
            }
        }
Example #20
0
        public static ScaleoutMessage FromBytes(byte[] data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            using (var stream = new MemoryStream(data))
            {
                var binaryReader = new BinaryReader(stream);
                var message = new ScaleoutMessage();
                message.Messages = new List<Message>();
                int count = binaryReader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    message.Messages.Add(Message.ReadFrom(stream));
                }
                message.ServerCreationTime = new DateTime(binaryReader.ReadInt64());

                return message;
            }
        }
        private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage)
        {
            Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count);

            _logger.WriteInformation(String.Format("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count));

            var localMapping = new LocalEventKeyInfo[scaleoutMessage.Messages.Count];
            var keys         = new HashSet <string>();

            for (var i = 0; i < scaleoutMessage.Messages.Count; ++i)
            {
                Message message = scaleoutMessage.Messages[i];

                // Remember where this message came from
                message.MappingId   = id;
                message.StreamIndex = streamIndex;

                keys.Add(message.Key);
                ulong localId = Save(message);
                MessageStore <Message> messageStore = Topics[message.Key].Store;

                localMapping[i] = new LocalEventKeyInfo(message.Key, localId, messageStore);
            }

            // Get the stream for this payload
            ScaleoutMappingStore store = StreamManager.Streams[streamIndex];

            // Publish only after we've setup the mapping fully
            store.Add(id, scaleoutMessage, localMapping);

            // Schedule after we're done
            foreach (var eventKey in keys)
            {
                ScheduleEvent(eventKey);
            }
        }
Example #22
0
 public ScaleoutMapping(ulong id, ScaleoutMessage message)
     : this(id, message, new Dictionary <string, IList <LocalEventKeyInfo> >())
 {
 }
 new internal void OnReceived(int streamIndex, ulong id, ScaleoutMessage messages)
 {
     base.OnReceived(streamIndex, id, messages);
 }
Example #24
0
        private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage)
        {
            Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count);

            _trace.TraceInformation("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count);

            var localMapping = new Dictionary<string, IList<LocalEventKeyInfo>>(StringComparer.OrdinalIgnoreCase);

            for (var i = 0; i < scaleoutMessage.Messages.Count; ++i)
            {
                Message message = scaleoutMessage.Messages[i];

                // Remember where this message came from
                message.MappingId = id;
                message.StreamIndex = streamIndex;

                IList<LocalEventKeyInfo> keyInfo;
                if (!localMapping.TryGetValue(message.Key, out keyInfo))
                {
                    keyInfo = new List<LocalEventKeyInfo>();
                    localMapping.Add(message.Key, keyInfo);
                }

                ulong localId = Save(message);
                MessageStore<Message> messageStore = Topics[message.Key].Store;

                keyInfo.Add(new LocalEventKeyInfo(localId, messageStore));
            }

            // Get the stream for this payload
            ScaleoutMappingStore store = StreamManager.Streams[streamIndex];

            // Publish only after we've setup the mapping fully
            store.Add(id, scaleoutMessage, localMapping);

            // Schedule after we're done
            foreach (var eventKey in localMapping.Keys)
            {
                ScheduleEvent(eventKey);
            }
        }
        public void SingleMessageOnlyVerifyIds()
        {
            var store = new ScaleoutStore(10);
            var message = new ScaleoutMessage();
            store.Add(new ScaleoutMapping(10ul, message));

            Assert.Equal(10ul, store.MinMappingId);
            Assert.Equal(10ul, store.MaxMapping.Id);
        }
 public ScaleoutMapping(ulong id, ScaleoutMessage message)
     : this(id, message, ListHelper <LocalEventKeyInfo> .Empty)
 {
 }
        public void AssertMessagesWithCursorForRange(int[] values, ulong targetId, ulong firstId, int count)
        {
            var store = new ScaleoutStore(10);

            var message = new ScaleoutMessage();
            foreach (var v in values)
            {
                store.Add(new ScaleoutMapping((ulong)v, message));
            }

            var result = store.GetMessagesByMappingId(targetId);
            Assert.Equal(firstId, result.FirstMessageId);
            Assert.Equal(count, result.Messages.Count);
        }
        private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage)
        {
            Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count);

            _trace.TraceInformation("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count);

            var localMapping = new LocalEventKeyInfo[scaleoutMessage.Messages.Count];
            var keys = new HashSet<string>();

            for (var i = 0; i < scaleoutMessage.Messages.Count; ++i)
            {
                Message message = scaleoutMessage.Messages[i];

                // Remember where this message came from
                message.MappingId = id;
                message.StreamIndex = streamIndex;

                keys.Add(message.Key);
                ulong localId = Save(message);
                MessageStore<Message> messageStore = Topics[message.Key].Store;

                localMapping[i] = new LocalEventKeyInfo(message.Key, localId, messageStore);
            }

            // Get the stream for this payload
            ScaleoutMappingStore store = StreamManager.Streams[streamIndex];

            // Publish only after we've setup the mapping fully
            store.Add(id, scaleoutMessage, localMapping);

            // Schedule after we're done
            foreach (var eventKey in keys)
            {
                ScheduleEvent(eventKey);
            }
        }
            public void Publish(int streamIndex, ulong id, IList<Message> messages, DateTime creationTime)
            {
                var message = new ScaleoutMessage
                {
                    Messages = messages,
                    ServerCreationTime = creationTime,
                };

                OnReceived(streamIndex, id, message);
            }
        public void AccurateMappingIds()
        {
            var store = new ScaleoutStore(10);
            var message1 = new ScaleoutMessage();
            store.Add(new ScaleoutMapping(10ul, message1));
            var message2 = new ScaleoutMessage();
            store.Add(new ScaleoutMapping(15ul, message2));

            Assert.Equal(10ul, store.MinMappingId);
            Assert.Equal(15ul, store.MaxMapping.Id);
        }
 public ScaleoutMapping(ulong id, ScaleoutMessage message)
     : this(id, message, ListHelper<LocalEventKeyInfo>.Empty)
 {
 }
        public void MinMappingIdMovesWhenOverflow()
        {
            var store = new ScaleoutStore(5);

            int id = 0;
            for (int i = 0; i < store.FragmentSize + 1; i++)
            {
                for (int j = 0; j < store.FragmentCount; j++)
                {
                    var message = new ScaleoutMessage();
                    store.Add(new ScaleoutMapping((ulong)id, message));
                    id++;
                }
            }

            Assert.Equal((ulong)store.FragmentSize - 1, store.MinMappingId);
        }
 private void forwardMessage(ulong id, ScaleoutMessage smsg)
 {
     //lock (_recvLock)
     {
         OnReceived(0, id, smsg);
         lastReceived = DateTime.Now;
     }
 }
        public void GettingMessagesWithCursorLowerThanMinReturnsAll()
        {
            var store = new ScaleoutStore(10);

            for (int i = 5; i < 10; i++)
            {
                var message = new ScaleoutMessage();
                store.Add(new ScaleoutMapping((ulong)i, message));
            }

            var result = store.GetMessagesByMappingId(4);
            Assert.Equal(0ul, result.FirstMessageId);
            Assert.Equal(5ul, store.MinMappingId);
            Assert.Equal(5, result.Messages.Count);
        }
        public void GettingMessagesWithCursorInbetweenOnElementRangeGetsAll()
        {
            var store = new ScaleoutStore(10);

            var message = new ScaleoutMessage();
            store.Add(new ScaleoutMapping((ulong)1, message));

            var result = store.GetMessagesByMappingId(2);
            Assert.Equal(0ul, result.FirstMessageId);
            Assert.Equal(0, result.Messages.Count);
        }
 /// <summary>
 /// Invoked when a payload is received from the backplane. There should only be one active call at any time.
 /// </summary>
 /// <param name="streamIndex">id of the stream.</param>
 /// <param name="id">id of the payload within that stream.</param>
 /// <param name="message">The scaleout message.</param>
 /// <returns></returns>
 protected virtual void OnReceived(int streamIndex, ulong id, ScaleoutMessage message)
 {
     StreamManager.OnReceived(streamIndex, id, message);
 }
 /// <summary>
 /// Invoked when a payload is received from the backplane. There should only be one active call at any time.
 /// </summary>
 /// <param name="streamIndex">id of the stream.</param>
 /// <param name="id">id of the payload within that stream.</param>
 /// <param name="message">The scaleout message.</param>
 /// <returns></returns>
 protected virtual void OnReceived(int streamIndex, ulong id, ScaleoutMessage message)
 {
     StreamManager.OnReceived(streamIndex, id, message);
 }
        public void GettingMessagesWithCursorBiggerThanMaxReturnsNothingIfNewer()
        {
            var store = new ScaleoutStore(10);

            for (int i = 0; i < 5; i++)
            {
                var message = new ScaleoutMessage();
                store.Add(new ScaleoutMapping((ulong)i, message));
            }

            var result = store.GetMessagesByMappingId(6);
            Assert.Equal(0, result.Messages.Count);
        }
        public void GettingMessagesWithSentinelCursorReturnsEverything()
        {
            var store = new ScaleoutStore(10);

            var message = new ScaleoutMessage();
            store.Add(new ScaleoutMapping((ulong)0, message));

            var result = store.GetMessagesByMappingId(UInt64.MaxValue);
            Assert.Equal(0ul, result.FirstMessageId);
            Assert.Equal(1, result.Messages.Count);
        }