0

我有一个使用 SQL 传输和 NHibernate 持久性使用 NSB7 构建的非常简单的 Saga。

Saga 侦听一个队列,接收到的每条消息都通过 4 个处理程序运行。它们按顺序调用,2 个处理程序并行运行,最后一个处理程序仅在两个并行处理程序完成后运行。最后一个处理程序将记录写入 DB

假设对于一条消息,每个处理程序需要 1 秒。当收到一条启动 Saga 的新消息时,预期结果是 3-4 秒后记录被写入数据库。

如果队列备份了 1000 条消息,一旦它们再次开始处理,则在最后一个处理程序中创建新记录之前需要将近 2000 秒。基本上,它们不是为每条消息运行预期的 4 秒处理时间,而是有效地聚集在初始处理程序中,直到队列被清空,然后为下一个处理程序再次执行此操作,并不断重复。

关于在负载下如何提高该系统的性能的任何想法,以便源源不断的已处理消息流出来,而不是在一条新记录出现在另一端之前的一堆消息和长时间延迟?

谢谢威尔

4

1 回答 1

1

There is documentation for saga concurrency issues: https://docs.particular.net/nservicebus/sagas/concurrency#high-load-scenarios

I still don't fully understand the issue though. Every message that instantiates a saga, should create a record in the database after the message was processed. Not after 1000 messages. How else is NServiceBus going to guarantee consistency?

Next to that, you probably should not have the single message be processed by 4 handlers. If it really needs to work like this, use publish/subscribe and create different endpoints. The saga should be done with processing as soon as possible, especially under high load scenarios.

于 2020-03-09T07:38:39.443 回答