public async Task <ITransport> CreateAsync(MobOperations mobOperations, Identity identity, RoutingTable routingTable, PeerTable peerTable, InboundMessageDispatcher inboundMessageDispatcher, AuditService auditService)
        {
            var transport = new TestTransport(this, identity, routingTable, peerTable, inboundMessageDispatcher);

            transports.Add(transport);

            // transport discovers existing test transports, they discover transport
            foreach (var otherTransport in transports)
            {
                if (otherTransport == transport)
                {
                    continue;
                }

                var otherTransportNewTransportRoutingContext = new TestRoutingContext(this, identity);
                otherTransport.SetupRoutingContext(otherTransportNewTransportRoutingContext);
                otherTransport.PeerTable.GetOrAdd(identity.Id).HandleInboundPeerIdentityUpdate(identity);

                var newTransportOtherTransportRoutingContext = new TestRoutingContext(this, otherTransport.Identity);
                transport.SetupRoutingContext(newTransportOtherTransportRoutingContext);
                transport.PeerTable.GetOrAdd(otherTransport.Identity.Id).HandleInboundPeerIdentityUpdate(otherTransport.Identity);
            }

            return(transport);
        }
Пример #2
0
        public Task <ITransport> CreateAsync(MobOperations mobOperations, Identity identity, RoutingTable routingTable, PeerTable peerTable, InboundMessageDispatcher inboundMessageDispatcher, AuditService auditService)
        {
            var inboundBytesAggregator  = auditService.GetAggregator <double>(DataSetNames.kInboundBytes);
            var outboundBytesAggregator = auditService.GetAggregator <double>(DataSetNames.kOutboundBytes);

            var tcpRoutingContextContainer = new TcpRoutingContextContainer();
            var payloadUtils = new PayloadUtils(inboundBytesAggregator, outboundBytesAggregator);
            var transport    = new TcpTransport(configuration, identity, routingTable, peerTable, inboundMessageDispatcher, tcpRoutingContextContainer, payloadUtils);

            transport.Initialize();
            mobOperations.RegisterMob(new TcpDebugMob(tcpRoutingContextContainer));
            return(Task.FromResult <ITransport>(transport));
        }
Пример #3
0
        public Task <ITransport> CreateAsync(MobOperations mobOperations, Identity identity, RoutingTable routingTable, PeerTable peerTable, InboundMessageDispatcher inboundMessageDispatcher, AuditService auditService)
        {
            // setup identity
            identity.Properties[UdpConstants.kUnicastPortIdentityPropertyKey] = configuration.UnicastReceiveEndpoint.Port.ToString();

            var duplicateFilter = new DuplicateFilter();

            duplicateFilter.Initialize();

            var inboundBytesAggregator  = auditService.GetAggregator <double>(DataSetNames.kInboundBytes);
            var outboundBytesAggregator = auditService.GetAggregator <double>(DataSetNames.kOutboundBytes);
            var inboundReceiveProcessDispatchLatencyAggregator = auditService.GetAggregator <double>(DataSetNames.kInboundProcessDispatchLatency);
            var resendsCounter                     = auditService.GetCounter(DataSetNames.kTotalResends);
            var resendsAggregator                  = auditService.GetAggregator <int>(DataSetNames.kMessageResends);
            var tossedCounter                      = auditService.GetCounter(DataSetNames.kTossed);
            var duplicatesReceivedCounter          = auditService.GetCounter(DataSetNames.kDuplicatesReceived);
            var announcementsReceivedCounter       = auditService.GetCounter(DataSetNames.kAnnouncementsReceived);
            var multiPartChunksSentCounter         = auditService.GetCounter(DataSetNames.kMultiPartChunksSent);
            var multiPartChunksReceivedAggregator  = auditService.GetAggregator <int>(DataSetNames.kMultiPartChunksBytesReceived);
            var outboundMessageRateLimitAggregator = auditService.GetAggregator <double>(DataSetNames.kOutboundMessageRateLimit);
            var sendQueueDepthAggregator           = auditService.GetAggregator <double>(DataSetNames.kSendQueueDepth);

            mobOperations.RegisterMob(new UdpDebugMob());

            var shutdownCts = new CancellationTokenSource();
            var acknowledgementCoordinator = new AcknowledgementCoordinator(identity);
            var udpUnicastScheduler        = SchedulerFactory.CreateWithCustomThreadPool($"Courier.Udp({identity.Id.ToShortString()}).Unicast");
            var sendReceiveBufferPool      = ObjectPool.CreateStackBacked(() => new byte[UdpConstants.kMaximumTransportSize]);
            var client        = UdpClient.Create(configuration, udpUnicastScheduler, sendReceiveBufferPool, inboundBytesAggregator, outboundBytesAggregator, inboundReceiveProcessDispatchLatencyAggregator);
            var payloadSender = new PayloadSender(client);
            var multiPartPacketReassembler = new MultiPartPacketReassembler();
            var udpUnicasterFactory        = new UdpUnicasterFactory(identity, client, acknowledgementCoordinator, sendReceiveBufferPool, resendsCounter, resendsAggregator, outboundMessageRateLimitAggregator, sendQueueDepthAggregator);
            var udpDispatcher = new UdpDispatcherImpl(identity, client, duplicateFilter, payloadSender, acknowledgementCoordinator, routingTable, peerTable, inboundMessageDispatcher, multiPartPacketReassembler, udpUnicasterFactory, announcementsReceivedCounter, tossedCounter, duplicatesReceivedCounter, multiPartChunksReceivedAggregator);

            multiPartPacketReassembler.SetUdpDispatcher(udpDispatcher);
            var announcer = new Announcer(identity, payloadSender, shutdownCts.Token);

            announcer.Initialize();
            var udpFacade      = new UdpFacade(client, udpDispatcher, shutdownCts);
            var udpBroadcaster = new UdpBroadcaster(identity, client);
            var transport      = new UdpTransport(udpBroadcaster, udpFacade);

            client.StartReceiving(udpDispatcher);

            return(Task.FromResult <ITransport>(transport));
        }
        public async Task <IRyuContainer> CreateAsync(IReadOnlySet <ITransportFactory> transportFactories, Guid?forceId = null)
        {
            var container      = root.CreateChildContainer();
            var proxyGenerator = container.GetOrDefault <ProxyGenerator>() ?? new ProxyGenerator();
            var shutdownCancellationTokenSource = new CancellationTokenSource();

            // Auditing Subsystem
            var auditService = new AuditService(shutdownCancellationTokenSource.Token);

            auditService.Initialize();

            // management tier containers
            var mobContextContainer = new MobContextContainer();
            var mobContextFactory   = new MobContextFactory(auditService);
            var mobOperations       = new MobOperations(mobContextFactory, mobContextContainer);

            // Other Courier Stuff
            var identity              = Identity.Create(forceId);
            var routingTable          = new RoutingTable();
            var peerDiscoveryEventBus = new AsyncBus <PeerDiscoveryEvent>();
            var peerTable             = new PeerTable(container, (table, peerId) => new PeerContext(table, peerId, peerDiscoveryEventBus));

            var inboundMessageRouter     = new InboundMessageRouter();
            var inboundMessageDispatcher = new InboundMessageDispatcher(identity, peerTable, inboundMessageRouter);

            var transports = new ConcurrentSet <ITransport>();

            foreach (var transportFactory in transportFactories)
            {
                var transport = await transportFactory.CreateAsync(mobOperations, identity, routingTable, peerTable, inboundMessageDispatcher, auditService).ConfigureAwait(false);

                transports.TryAdd(transport);
            }

            var messenger = new Messenger(identity, transports, routingTable);

            container.Set(identity);
            container.Set(routingTable);
            container.Set(peerTable);
            container.Set(inboundMessageRouter);
            container.Set(messenger);

            //----------------------------------------------------------------------------------------
            // Service Tier - Service Discovery, Remote Method Invocation
            //----------------------------------------------------------------------------------------
            var localServiceRegistry        = new LocalServiceRegistry(identity, messenger);
            var remoteServiceInvoker        = new RemoteServiceInvoker(identity, messenger);
            var remoteServiceProxyContainer = new RemoteServiceProxyContainer(proxyGenerator, remoteServiceInvoker);

            inboundMessageRouter.RegisterHandler <RmiRequestDto>(localServiceRegistry.HandleInvocationRequestAsync);
            inboundMessageRouter.RegisterHandler <RmiResponseDto>(remoteServiceInvoker.HandleInvocationResponse);
            container.Set(localServiceRegistry);
            container.Set(remoteServiceProxyContainer);

            //----------------------------------------------------------------------------------------
            // Management Tier - DMI - Services
            //----------------------------------------------------------------------------------------
            var managementObjectService = new ManagementObjectService(mobContextContainer, mobOperations);

            localServiceRegistry.RegisterService <IManagementObjectService>(managementObjectService);
            container.Set(mobOperations);
            container.Set(managementObjectService);

            var facade = new CourierFacade(transports, container);

            container.Set(facade);

            return(container);
        }