【问题标题】:How to query Sagas stored in SQL Persistence table如何查询存储在 SQL Persistence 表中的 Sagas
【发布时间】:2020-11-02 21:29:12
【问题描述】:

我需要查询 Saga Data 类的属性以获取列表。它作为序列化对象存储在 SqlPersistance 表 [Data] 列中。 想想我的 SagaData 有一个名为 UserName 的属性的场景,所以我想查询与该用户相关的每个 saga。 以一种草率的方式,我可以查询列内容,获取列表,并可以通过以下查询从内容中创建 Saga 对象:

SELECT [Id]
      ,[Correlation_TaskId]
      ,[Metadata]
      ,[Data]
      ,[PersistenceVersion]
      ,[SagaTypeVersion]
      ,[Concurrency]
  FROM [myWonderfulDb].[dbo].[MyWonderfulPeristanceTable]
  where JSON_VALUE(Data,'$.Username') = 'arthur' 

但我正在寻找一种优雅的方式,可能会使用 NserviceBus API。 ParticularSoftware 文档(链接:https://docs.particular.net/persistence/sql/saga-finder)中描述了一个 SagaFinder 实现,但这仅返回一个不完全适合我的场景的对象。

这里是如何在文档中实现的:

class SqlServerSagaFinder :
    IFindSagas<MySagaData>.Using<MyMessage>
{
    public Task<MySagaData> FindBy(MyMessage message, SynchronizedStorageSession session, ReadOnlyContextBag context)
    {
        return session.GetSagaData<MySagaData>(
            context: context,
            whereClause: "JSON_VALUE(Data,'$.PropertyPathInJson') = @propertyValue",
            appendParameters: (builder, append) =>
            {
                var parameter = builder();
                parameter.ParameterName = "propertyValue";
                parameter.Value = message.PropertyValue;
                append(parameter);
            });
    }
}

任何想法表示赞赏。谢谢!

【问题讨论】:

  • 为什么需要查询saga数据?为什么不能是直接的sql查询呢?毕竟它是一个数据库存储,你不需要 NSB api。
  • @HadiEskandari 你好,哈迪,是的,我可以直接从数据库中完成,但我正在寻找一种 Nservicebus 方式来处理它。

标签: nservicebus nservicebus-sagas


【解决方案1】:

我们提供了有关查询 saga 状态的指南

https://docs.particular.net/nservicebus/sagas/#querying-saga-data

简而言之,您可以查询 saga 数据,NServiceBus 没有提供开箱即用的方法,因为我们建议使用不同的方法:

saga 发布包含所需数据的事件,并拥有处理这些事件的处理程序,并将数据存储在一个或多个读取模型中以供查询。

我们不推荐它的主要观点在我看来是这两个

  • 通过将数据暴露在 saga 中业务逻辑的保护措施之外,风险在于数据不会被视为 只读。最终,一个组件试图绕过 saga 并 直接修改数据。
  • 查询数据可能需要额外的索引、资源等,这些需要由发出查询的组件管理。 这些额外的资源会影响 saga 的性能。

【讨论】:

    【解决方案2】:

    SagaFinder 的唯一目的是找到与传入消息相关的某个 saga 的单个实例。我不知道查询 saga(数据)实例的任何框架功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2022-10-13
      • 1970-01-01
      • 2012-08-18
      • 2017-11-10
      相关资源
      最近更新 更多