事件商店死亡后,我该如何正确处理追赶订阅的重新连接

时间:2018-09-25 10:58:13

标签: event-store get-event-store

当追赶订阅重新连接时,事件存储似乎不一致。根据google组中的线程和实验,如果SubscriptionDropReason为ConnectionClosed,则追赶的订阅似乎会自动重新连接。

但是,如果您随后尝试停止这些连接并指定超时,则它们似乎永远不会真正停止并且总是超时。

我使用了this post中的代码,但我相信这会产生误导,因为在我的实验中,在这种情况下会收到多个事件的原因是因为事件存储重新联机后,事件存储会自动重新订阅CatchupSubscriptions因为当原因为ConnectionClosed时您不重新订阅,那么您将不会多次收到事件。如果我修改此代码以将超时添加到.Stop(timeout)方法中,则它只会挂起并抛出。

自动重新连接后,当我接到实时处理启动事件的调用时,EventStoreCatchUpSubscription对象具有内部状态,该状态指示_isDropped=1对我来说也很奇怪,因为它没有掉线,实际上处理事件。

所以我的问题是我应该如何处理事件存储自动重新连接并且我想断开连接并等待超时的情况?

1 个答案:

答案 0 :(得分:1)

“ subscriptionDropped”事件是处理连接问题的好地方。 事件存储项目中仍然存在一个未解决的问题。

https://github.com/EventStore/EventStore/issues/929

https://github.com/EventStore/EventStore/issues/1127

eventStoreConnection.SubscribeToAllFrom(lastCheckpoint, catchUpSubscriptionSettings,
                eventAppeared(projection),
                liveProcessingStarted(projection),subscriptionDropped(projection),userCredentials );   



 private Action<EventStoreCatchUpSubscription, SubscriptionDropReason, Exception> subscriptionDropped(Projection projection)
            => async (eventStoreCatchUpSubscription, subscriptionDropReason, exception) =>
            {

                eventStoreCatchUpSubscription.Stop();

                switch (subscriptionDropReason)
                {
                    case SubscriptionDropReason.UserInitiated:
                        Console.WriteLine($"{projection} projection stopped by user.");
                        break;
                    case SubscriptionDropReason.SubscribingError:
                    case SubscriptionDropReason.ServerError:
                    case SubscriptionDropReason.ConnectionClosed:
                    case SubscriptionDropReason.CatchUpError:
                    case SubscriptionDropReason.ProcessingQueueOverflow:
                    case SubscriptionDropReason.EventHandlerException:
                        Console.WriteLine($"{projection} projection stopped because of a transient error ({subscriptionDropReason}). ");
                        Console.WriteLine($"Exception Detail:  {exception}");    
                        Console.WriteLine("Attempting to restart...");
                        // Re-build your subscription in here
                        Task.Run(() => StartProjection(projection));
                        break;
                    default:
                        Console.WriteLine("Your subscription gg");
                        Console.WriteLine($"Exception Detail:  {exception}");    
                        break;
                }
            };