MongoDB的事件存储订阅服务



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

在互联网上找不到任何关于这一点的特别信息,但这可能吗?简而言之,我的问题可能是,你能将两者混合匹配在一起吗?或者为了做到这一点,我必须将我的事件写入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. 正在订阅GetEventStore中名为"的流mongodb://localhost:27017/Test"
  3. 将事件保存到MongoDb

据我所见,您从未将任何事件保存到GetEventStore,因此EventAppared方法中从未出现任何事件。您正在保存到MongoDb。

[更新]

我想订阅Mongodb流并填充GetEventStore,根据我从您的回答中收集到的信息,我认为这是不可能的。

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

相关内容

  • 没有找到相关文章

最新更新