2013-03-05 43 views
1

我想創建一組ServiceStack服務,託管在同一個主機應用程序中,它們都將使用共享的一組文件資源。爲了防止衝突,我打算創建同步代碼(aka locking)以防止文件上的讀/寫衝突。如何跨越多個服務之間的多個ServiceStack服務調用實現資源同步?

如果我只是想鎖定單個服務方法調用的持續時間的文件,解決方案也簡單。例如,我可以創建一個同步的全局對象來跟蹤會話密鑰的鎖定。但是,我希望客戶端應用程序能夠在不同ServiceStack服務中的多個不同方法的MULTIPLE調用期間鎖定文件資源。

什麼是實現這一目標的最佳方式(或者是這其中一個問題,人們會告訴我,我不應該這樣做)?

這裏是我到目前爲止認爲:

  1. 如果我可以分享在多個ServiceStack服務的單一的ISession的對象,我可以跟蹤基於會話密鑰文件鎖。但我無法找到這樣做。這需要使用JsonServiceClient對象與C#客戶端一起工作,每個ServiceStack服務都會有一個這樣的對象,並且它們每個都會在服務端生成一個單獨的ISession。

  2. 如果我實現身份驗證,我可以跟蹤被認證的用戶ID鎖,但兩個獨立的人可能會使用在這種情況下,他們不能共享資源鎖相同的登錄。

  3. 我可以結合我所有的服務方式到一個單一的服務的話,這將共享同一個會話。這意味着要創建一個複雜的請求對象,這個對象可能是幾個可能請求的組合。這聽起來可能不是那種可怕的混亂。請求對象可以是用自定義SQL語言編寫的查詢字符串,我的服務將解析並運行查詢。我不想這樣做,因爲它是一個很多的編碼工作(儘管如果有人知道自定義SQL語言的免費,強大的解析工具,我可能會考慮它)。

  4. 創建多爾斯出交易ID的交易服務。如果客戶想要持有一個鎖,它必須首先從Transaction服務中獲得一個事務ID,並在每個後續服務調用中傳遞該ID(它將成爲每個請求類中的一個可選屬性)。這與在服務之間共享一個會話(或者說,一個會話密鑰)沒有多大區別,但是我正在讓客戶端完成一些工作。 FEH。

回答

2

我有點失去了你的意思是什麼服務,你可以有多個與一個單一的應用主機,並使用會話機制將允許您服務之間共享一個特定的客戶端會話。在服務棧會話使用ICacheClient您已註冊,所以如果你有,說一個服務器農場,你可以使用類似RedisCacheClient共享運行相同的應用主機的多臺服務器之間的會話信息。如果你想鎖定一個文件,你也可以在ICacheClient中存儲這個信息。所以你可以做這樣的事情:

public class FileLock 
{ 
    public string ClientId { get; set; } 
    public string FileId { get; set; } 
} 

public class FileLockService : Service 
{ 
    public object Post(FileLock req) 
    { 
     // this will only be added to the cache if it doesn't exist 
     // but understand that the cache key needs to be unique 
     // within the entire system, so qualify it with a urn... 
     var wasAbleToLock = Cache.Add("file:lock:" + req.FileId, req.ClientId); 

     return wasAbleToLock; 
    } 

    public object Get(FileLock req) 
    { 
     // return the client id for who ever has the lock 
     return Cache.Get("file:lock:" + req.FileId); 
    } 
} 
+0

「服務」我的意思是一個實現ServiceStack.ServiceInterface.Service類的實例化。 結論是,我如何獲得兩個獨立的服務來「共享特定的客戶端會話?」我不知道該怎麼做。在單個C#客戶端程序中,如果我使用兩個單獨的JsvServiceClient對象調用兩個單獨的服務,它們都會自動生成它們自己的Session。 – 2013-03-05 21:31:00

+0

我明白你在做什麼,你實際上想在客戶端之間共享會話狀態。我假設你在客戶端進行某種認證。如果是這樣,只需獲取會話之間的公共密鑰,如'UserId'並使用它來鎖定文件。現在,如果您只有一個客戶端,但正在進行多個調用,則可以多次使用相同的「JsonServiceClient」。通常在進行集成測試時,我會創建一個服務客戶端,進行身份驗證呼叫(它在內部存儲會話cookie),然後使用同一個客戶端進行其他幾個呼叫。 – 2013-03-06 13:28:21