public static void RegisterMob(this MobOperations mobOperations, object mobInstance) { Guid mobId; if (!mobInstance.GetType().TryGetInterfaceGuid(out mobId)) { throw new InvalidOperationException($"Mob of type {mobInstance.GetType().FullName} does not have default service id."); } RegisterMob(mobOperations, mobId, mobInstance); }
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); }
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; }
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; }
public ManagementObjectService(MobContextContainer mobContextContainer, MobOperations mobOperations) { this.mobContextContainer = mobContextContainer; this.mobOperations = mobOperations; }
public static void RegisterMob(this MobOperations mobOperations, Guid mobId, object mobInstance) { mobOperations.RegisterMob(mobId, mobInstance, mobInstance.GetType().FullName); }