MongoDB 的 Event Store 订阅服务

Event Store subscription service to MongoDB

我想知道是否可以通过 Get Event Store 创建对 Mongo 的订阅服务?也许我措辞不正确,但让我解释一下。我目前有一个使用 NEventStore 将事件写入 Mongo Database 的过程。我想做的是有一个订阅服务,订阅 Stream in Mongo.

无法在互联网上找到任何关于此的内容,但是这可能吗?简而言之,我的问题可能是您能否将两者混合搭配在一起,或者为了做到这一点,我必须将我的事件写入 eventstore 而不是 Mongo?也许,我做错了,还有其他选择吗?

我可以看到正在写入我的事件,但它无法触发 EventAppeared。目前所有这些都在我的机器上本地完成。

我已经尝试创建一个精简的应用程序来执行此操作:

  1. 使用以下方法创建订阅

        using (var connection = EventStoreConnection.Create(new IPEndPoint(IPAddress.Loopback, 1113)))
        {
            connection.SubscribeToStreamAsync(@"mongodb://localhost:27017/Test", false, EventAppeared, SubscriptionDropped);
    
            var repository = new NEventStoreRepository();
            repository.Write(new SomethingHasHappened("Hello"));
    
            Console.ReadLine();
        }
    
    private static void SubscriptionDropped(EventStoreSubscription arg1, SubscriptionDropReason arg2, Exception arg3)
    {
    }
    
    private static void EventAppeared(EventStoreSubscription arg1, ResolvedEvent arg2)
    {
    }
    
  2. 我通过 NEventStore

    将事件写入我的 mongo 数据库
    public void Write(object @event)
    {
        var id = Guid.NewGuid();
    
        using (var scope = new TransactionScope())
        {
            using (var store = WireupEventStore())
            {
                using (var stream = store.OpenStream(id.ToString(), 0, int.MaxValue))
                {
                    stream.Add(new EventMessage { Body = @event });
                    stream.CommitChanges(Guid.NewGuid());
                    scope.Complete();
                }
            }
        }
    
        Console.ReadKey();
    }
    
    private static IStoreEvents WireupEventStore()
    {
        return Wireup
            .Init()
            .LogToOutputWindow()
            .UsingMongoPersistence("NEventStore.MongoDB", new DocumentObjectSerializer())
            .InitializeStorageEngine()
            .UsingJsonSerialization()
            .Build();
    }
    

正常的事件流程如下:

(假定一切都已安装并且 运行...)

  1. 在您的 GetEventStore 中注册流的订阅者 申请代码
  2. 将事件保存到流中
  3. 事件出现在您的订阅者中

我认为您要么混淆了事情的流程,要么试图做一些完全不受支持的事情(比如让 MongoDb 订阅 GetEventStore)。我认为你的代码正在做的是:

  1. 正在设置 NEventStore 以保存到 MongoDb
  2. 正在订阅名为 "mongodb://localhost:27017/Test"
  3. 的 GetEventStore 中的流
  4. 正在将事件保存到 MongoDb

据我所知,您从未将任何事件保存到 GetEventStore,因此 EventAppeared 方法中什么也没有出现。您正在保存到 MongoDb.

[更新]

I want to subscribe to a Mongodb stream and populate GetEventStore which I believe isn't possible from what I gather from your answer.

MongoDb 没有流,它有集合——它是一个文档数据库。流是 GetEventStore 中的一个概念。但是,看起来 NEventStore 允许您连接消息调度程序,这大概意味着您可以注册处理程序来侦听事件。在这些处理程序中,您可以保存到 GetEventStore。