簡體   English   中英

如何查詢存儲在 SQL Persistence 表中的 Sagas

[英]How to query Sagas stored in SQL Persistence table

我需要查詢 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 狀態的指南,請訪問

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

簡而言之,您可以查詢 saga 數據,NServiceBus 沒有提供開箱即用的方式,因為我們建議使用不同的方法:

saga 發布包含所需數據的事件,並具有處理這些事件的處理程序,並將數據存儲在一個或多個讀取模型中以供查詢。

我們不推薦它的主要觀點在我看來是這兩點

  • 通過將數據暴露在 saga 中業務邏輯的保護措施之外,風險在於數據不被視為只讀。 最終,一個組件試圖繞過 saga 並直接修改數據。
  • 查詢數據可能需要額外的索引、資源等,這些需要由發出查詢的組件管理。 這些額外的資源會影響 saga 的性能。

SagaFinder的唯一目的是找到與傳入消息相關的某個 saga 的單個實例。 我不知道查詢 saga(數據)實例的任何框架功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM