private async Task ConnectToClusterAsync()
        {
            await EnsureOrleansClusterConnection();

            OrleansLog.Subscribing(_logger, _id);

            var provider = _clusterClient.GetStreamProvider(Constants.STREAM_PROVIDER);

            _clientMessageStream = provider.GetStream <ClientInvocationMessage>(_id, Constants.CLIENT_MESSAGE_STREAM_NAMESPACE);
            await _clientMessageStream.SubscribeAsync(async (message, token) => await OnReceivedClientMessageAsync(message));

            _allMessageStream = provider.GetStream <AllInvocationMessage>(_hubTypeId, Constants.HUB_MESSAGE_STREAM_NAMESPACE);
            await _allMessageStream.SubscribeAsync(async (message, token) => await OnReceivedAllMessageAsync(message));

            try
            {
                await _clusterClient.GetHubLifetimeManagerGrain(_id, _hubTypeId).OnInitializeAsync(_options.TimeoutInterval ?? TimeSpan.FromSeconds(30));

                // Tick heartbeat
                heartbeatDisposable = Observable.Interval(TimeSpan.FromSeconds(1))
                                      .Subscribe(async value =>
                {
                    await _clusterClient.GetHubLifetimeManagerGrain(_id, _hubTypeId).OnHeartbeatAsync();
                });
            }
            catch (Exception e)
            {
                OrleansLog.InternalMessageFailed(_logger, e);
            }
        }